def test_multiple_context(): from block.chain import ListF M = ListF() assert chain.chain.value(M, M.unit(10)) == [10] def tri(ctx, x): return [x, x+1, x] assert chain.chain.do(tri).do(tri).value(M, M.unit(10)) == [10, 11, 10, 11, 12, 11, 10, 11, 10] assert chain.chain.do(tri).do(chain(lambda x: x*2)).value(M, M.unit(10)) == [20,22,20] assert chain.chain.do(tri).do(chain.__add__(10)).value(M, M.unit(10)) == [20,21,20]
def test_stop_context(): from block.chain import MaybeF, Nothing from block.chain import ErrorF class A: class x: class y: z = 10 class Wrapper(object): def __init__(self, v): self.v = v def wrap(self, x): return [x, self.v, x] assert chain.chain.do(chain.x.y.z).value(MaybeF(), A) == 10 assert chain.chain.do(chain["x"]["y"]["z"]).value(MaybeF(), {"x": {"y": {"z": 10}}}) == 10 assert chain.chain.do(chain.x.x.y.z).value(MaybeF(), A) == Nothing assert chain.chain.do(chain["x"]["y"]).do(chain(string_append, "!")).value(MaybeF(), {"x": {"y": "foo"}}) == "foo!" assert chain.chain.do(chain.wrap("a")).value(ErrorF(), Wrapper("value")) == ["a", "value", "a"] assert repr(chain.chain.do(chain.x.x.y.z).value(ErrorF(), A)) == u"""'Failure':[AttributeError("class x has no attribute 'x'",)]"""
def test_state_context(): from block.chain import StateF from block.chain import inc, put ctx = StateF() assert chain.chain.value(ctx, ctx.unit(10))(0) == (0, 10) assert chain.chain.do(inc).do(inc).value(ctx, ctx.unit(10))(0) == (2, 10) assert chain.chain.do(inc).do(inc).do(put(100)).do(inc).do(inc).value(ctx, ctx.unit(10))(0) == (102, 10) assert chain.chain.do(inc).map(lambda x : x + 10).value(ctx, ctx.unit(10))(0) == (1, 20) def twice(ctx, _): return lambda s: (s, s*s) assert chain.chain.do(chain["x"]).value(ctx, ctx.unit({"x": 100}))(10) == (10, 100) assert chain.chain.do(inc).do(chain["x"]).value(ctx, ctx.unit({"x": 100}))(10) == (11, 100) assert chain.chain.do(chain["x"]).do(inc).value(ctx, ctx.unit({"x": 100}))(10) == (11, 100) assert chain.chain.do(put(10)).do(inc).do(twice).do(twice).do(inc).do(twice).value(ctx, ctx.unit(-1))(0) == (12, 144) assert chain.chain.do(chain(lambda x: x+1)).value(ctx, ctx.unit(10))(0) == (0, 11) class X: def sq(self, x): return x * x assert chain.chain.do(chain.sq(10)).value(ctx, ctx.unit(X()))(10) == (10, 100)