def main(encoders, printer):

	summary = OrderedDict()
	for name, encoder in encoders:
		summary[name] = 0

	for index, count, name, values in get_all():
		item = {}

		for enc_name, encoder in encoders:
			size = encoder.bytes_length(values)
			item[enc_name] = size
			summary[enc_name] += size

		printer.write_item(name, index + 1, count, item)
	else:
		printer.write_summary(summary)
from sampledata import get_all

class Stats:
	def __init__(self):
		self.count = 0
		self.sum = 0
		self.min = None
		self.max = None

value  = Stats()
length = Stats()
all_values = set()

for i, count, name, values in get_all():
	value.count += 1

	all_values.update(set(values))

	if value.min is None:
		value.min = min(values)
		value.max = max(values)
	else:
		value.min = min(value.min, min(values))
		value.max = max(value.max, max(values))

	if length.min is None:
		length.min = length.max = len(values)
		
	length.min = min(length.min, len(values))
	length.max = max(length.max, len(values))
	length.count += 1
def demo(values):
	enc = Encoder(values)
	sequence, pairs = enc.encode()

	orig_size   = sum(encoded_size(v) for v in values)

	seq_size    = sum(encoded_size(v) for v in sequence)

	pairs_size  = sum(encoded_size(v) for v in pairs)
	pairs_size += sum(encoded_size(pair[0]) + encoded_size(pair[1]) for pair in pairs.itervalues())

	print 'original size: ', orig_size
	print
	print 'sequence size: ', seq_size
	print '   pairs size: ', pairs_size
	print '   total size: ', seq_size + pairs_size


if __name__ == '__main__':

	def get_diff(values):
		return [values[0]] + [b - a for a, b in zip(values, values[1:])]

	for index, count, name, values in get_all():
		print "verifying %d/%d..." % (index + 1, count)
		verify(get_diff(values))
		print "ok"

	print "encoding example"
	demo(get_diff(sample()))