Beispiel #1
0
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]
Beispiel #2
0
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'",)]"""
Beispiel #3
0
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)