git.fiddlerwoaroof.com
Raw Blame History
import collections
import copy

class TypeDict(collections.MutableMapping):
	def __init__(self, *args, **kw):
		if '__default' in kw:
			self.default = kw.pop('__default')

		self.store = dict(args)
		self.store.update(kw)

	def get_store(self, cls):
		cur = self.store
		bases = cls.__bases__
		if bases:
			head, tail = bases[0], bases[1:]
			while tail:
				cur = self.store.setdefault(head, {})
				head, tail = tail[0], tail[1:]
		return cur

	def __getitem__(self, cls):
		store = self.get_store(cls)
		try:
			print store
			return store[cls]
		except KeyError:
			if hasattr(self, 'default'):
				return copy.copy(self.default)
			else:
				raise

	def __setitem__(self, cls, value):
		store = self.get_store(cls)
		store[cls] = value
	def __delitem__(self, cls):
		store = self.get_store(cls)
		del store[cls]

	def __iter__(self):
		return TypeDictIterator(self)
	def __len__(self):
		return len(self.slots)

class _Null: pass

class TypeDictIterator(collections.Iterator):
	def __init__(self, dct):
		self.dct = dct
		self.dcts = [dct]
		self.iters = [iter(dct)]
		self.cur = self.iters[-1]

	def next(self):
		result = _Null
		try: result = self.cur.next()
		except StopIteration:
			self.iters.pop()
			self.dcts.pop()
			if self.iters:
				self.cur = self.iters[-1]
				result = self.cur.next()
			else:
				raise StopIteration

		if result in self.dcts[-1] and self.dcts[-1][result]:
			self.iters.append(iter(self.dcts[-1][result]))
			self.cur = self.iters[-1]

		return result