def test_union_types(): f = Dispatcher('f') f.register((int, float))(inc) assert f(1) == 2 assert f(1.0) == 2.0
class IntPowerInt(IntegerExpression, PowerBase, FunctionOfInts): pass class RealPowerInt(RealNumberExpression, PowerBase, FunctionOfInts): pass class RealPowerReal(RealNumberExpression, PowerBase, FunctionOfReals): pass Power = Dispatcher('Power') Power.register(IntegerExpression, IntegerExpression)(IntPowerInt) Power.register(RealNumberExpression, IntegerExpression)(RealPowerInt) Power.register(RealNumberExpression, RealNumberExpression)(RealPowerReal) class QuotientBase(NumberExpression, BinaryFunction): def __str__(self): return '(%s / %s)' % (self.lhs, self.rhs) class QuotientReal(RealNumberExpression, QuotientBase, FunctionOfReals): pass class QuotientInt(RealNumberExpression, QuotientBase, FunctionOfInts): pass
def test_vararg_not_last_element_of_signature(): f = Dispatcher('f') assert raises(TypeError, lambda: f.register([float], str)(lambda: None))
def test_vararg_has_multiple_elements(): f = Dispatcher('f') assert raises(TypeError, lambda: f.register([float, str])(lambda: None))
from collections import Iterable from six import string_types tupify = Dispatcher('tupify') @tupify.register(Iterable) def tupify_iterable(obj): return tuple(obj) flatten = Dispatcher('flatten') @flatten.register(object, Iterable) def flatten_iterable(depth, arg): if depth > 0: return sum(tuple(tupify(flatten(depth - 1, x)) for x in arg), tuple()) else: return arg def tup_of_obj(x): return (x, ) tupify.register((object, string_types))(tup_of_obj) flatten.register(object, (object, string_types))(lambda x, y: tup_of_obj(y)) # Currying for flatten flatten.register(object)(lambda x: (lambda y: flatten(x, y)))