#!/usr/bin/python

num_handlers = 0
output_bits = 0

def useBit(flip):
    # print flip
    # results.append(flip)
    global output_bits
    output_bits = output_bits +1

class StreamHandler:
    def __init__(self):
        global num_handlers
        num_handlers = num_handlers +1
        self.lastcoin = None
        self.streams = [None, None]

    def streamPush(self, streamid, flip):
        if self.streams[streamid] == None:
            self.streams[streamid] = StreamHandler()
        self.streams[streamid].push(flip)

    def push(self, flip):
        if self.lastcoin == None:
            self.lastcoin = flip
        else:
            if self.lastcoin == flip:
                self.streamPush(0, 1)
                self.streamPush(1, flip)
            else:
                useBit(flip)
                self.streamPush(0, 0)
            self.lastcoin = None

handler = StreamHandler()
rn = open('/dev/urandom', 'r')

input_bytes = 16386

coins = rn.read(input_bytes)
for char in coins:
    c = ord(char)
    for i in range(0,8):
        handler.push((c >> i) & 1)

print "Input bits:", input_bytes *8
print "Handlers created:", num_handlers
print "Output bits:", output_bits
print "Ratio:", output_bits / (input_bytes*8.0)
print "Reciprocal ratio:", input_bytes*8.0 / output_bits
