def coerce(self, value): if value is None: return None if isinstance(value, Entity): return value.identity if isinstance(value, identity.Identity): return value value_repr = None try: value_repr = repr(value) except Exception as e: raise TypeError( ("Object passed to coerce is not an identity. Additionally, " "calling repr(object) raised %s.") % e) if superposition.insuperposition(value): if superposition.state_type(value) == identity.Identity: return value raise TypeError( "Object being coerced as identity is a superposition %s of " "variant type %r." % (value_repr, value.type_name)) raise TypeError("%s is not an identity." % value_repr)
def __init__(self, first_state=None, *states): self._delegate = self._make_delegate() if first_state is None: return self._state_type = superposition.state_type(first_state) self.add_state(first_state) for state in states: if superposition.state_type(state) != self.state_type(): raise TypeError( "All states of a superposition must be of the same type." " First argument was of type %r, but argument %r is of " " type %r." % (self.state_type(), state, superposition.state_type(state))) self.add_state(state)
def testNesting(self): """Test that superpositions remain flat.""" s = superposition.superposition("foo", "bar") s = superposition.superposition(s, "baz") self.assertStateEq(superposition.superposition("foo", "bar", "baz"), s) s = superposition.superposition("zoo", s) self.assertStateEq( superposition.superposition("foo", "bar", "baz", "zoo"), s) self.assertEqual(superposition.state_type(s), type("foo"))
def _typecheck(self, other, operation="compare"): other_type = superposition.state_type(other) if other_type != self._state_type: raise TypeError( "Can't %s %r of state type %r with %r of state type %r." % (operation, other, other_type, self, self._state_type))