"""Redo the `...` (representation) but with limits on most sizes."""

import string

class Repr:
	def __init__(self):
		self.maxlevel = 6
		self.maxtuple = 6
		self.maxlist = 6
		self.maxdict = 4
		self.maxstring = 30
		self.maxlong = 40
		self.maxother = 20
	def repr(self, x):
		return self.repr1(x, self.maxlevel)
	def repr1(self, x, level):
		typename = `type(x)`[7:-2] # "<type '......'>"
		if ' ' in typename:
			parts = string.split(typename)
			typename = string.joinfields(parts, '_')
		if hasattr(self, 'repr_' + typename):
			return getattr(self, 'repr_' + typename)(x, level)
		else:
			s = `x`
			if len(s) > self.maxother:
				i = max(0, (self.maxother-3)/2)
				j = max(0, self.maxother-3-i)
				s = s[:i] + '...' + s[len(s)-j:]
			return s
	def repr_tuple(self, x, level):
		n = len(x)
		if n == 0: return '()'
		if level <= 0: return '(...)'
		s = ''
		for i in range(min(n, self.maxtuple)):
			if s: s = s + ', '
			s = s + self.repr1(x[i], level-1)
		if n > self.maxtuple: s = s + ', ...'
		elif n == 1: s = s + ','
		return '(' + s + ')'
	def repr_list(self, x, level):
		n = len(x)
		if n == 0: return '[]'
		if level <= 0: return '[...]'
		s = ''
		for i in range(min(n, self.maxlist)):
			if s: s = s + ', '
			s = s + self.repr1(x[i], level-1)
		if n > self.maxlist: s = s + ', ...'
		return '[' + s + ']'
	def repr_dictionary(self, x, level):
		n = len(x)
		if n == 0: return '{}'
		if level <= 0: return '{...}'
		s = ''
		keys = x.keys()
		keys.sort()
		for i in range(min(n, self.maxdict)):
			if s: s = s + ', '
			key = keys[i]
			s = s + self.repr1(key, level-1)
			s = s + ': ' + self.repr1(x[key], level-1)
		if n > self.maxdict: s = s + ', ...'
		return '{' + s + '}'
	def repr_string(self, x, level):
		s = `x[:self.maxstring]`
		if len(s) > self.maxstring:
			i = max(0, (self.maxstring-3)/2)
			j = max(0, self.maxstring-3-i)
			s = `x[:i] + x[len(x)-j:]`
			s = s[:i] + '...' + s[len(s)-j:]
		return s
	def repr_long_int(self, x, level):
		s = `x` # XXX Hope this isn't too slow...
		if len(s) > self.maxlong:
			i = max(0, (self.maxlong-3)/2)
			j = max(0, self.maxlong-3-i)
			s = s[:i] + '...' + s[len(s)-j:]
		return s
	def repr_instance(self, x, level):
		try:
			s = `x`
			# Bugs in x.__repr__() can cause arbitrary
			# exceptions -- then make up something
		except:
			return '<' + x.__class__.__name__ + ' instance at ' + \
				  hex(id(x))[2:] + '>'
		if len(s) > self.maxstring:
			i = max(0, (self.maxstring-3)/2)
			j = max(0, self.maxstring-3-i)
			s = s[:i] + '...' + s[len(s)-j:]
		return s

aRepr = Repr()
repr = aRepr.repr
