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)
def test_map(): from block.chain import ( ListF, ErrorF, MaybeF, StateF, Nothing, Failure ) assert chain.chain.map(lambda x : x+1).value(MaybeF(),Nothing) == Nothing assert chain.chain.map(lambda x : x+1).value(MaybeF(), 10) == 11 assert chain.chain.map(lambda x,y : x+y ,12).value(MaybeF(), 10) == 22 assert chain.chain.map(lambda x,y : x+y ,Nothing).value(MaybeF(), 10) == Nothing assert chain.chain.map(lambda x,y,z : [x,y,z] ,12, 13).value(MaybeF(), 11) == [11,12,13] assert chain.chain.map(lambda x,y,z : [x,y,z] ,Nothing, 12).value(MaybeF(), 11) == Nothing assert repr(chain.chain.map(lambda x : x+1).value(ErrorF(), Failure(10))) == "'Failure':[10]" assert chain.chain.map(lambda x : x+1).value(ErrorF(), 10) == 11 assert chain.chain.map(lambda x,y : x+y ,12).value(ErrorF(), 10) == 22 assert repr(chain.chain.map(lambda x,y : x+y ,Failure(11)).value(ErrorF(), 10)) == "'Failure':[11]" assert chain.chain.map(lambda x,y,z : [x,y,z] ,12, 13).value(ErrorF(), 11) == [11,12,13] assert repr(chain.chain.map(lambda x,y,z : [x,y,z] ,Failure(11), 12).value(ErrorF(), 11)) == "'Failure':[11]" ctx = StateF() assert chain.chain.map(lambda x : x+1).value(ctx, ctx.unit(10))(0) == (0,11) assert chain.chain.map(lambda x,y : x+y ,ctx.unit(12)).value(ctx, ctx.unit(10))(0) == (0, 22) assert chain.chain.map(lambda x,y : x+y, ctx.put(ctx.unit(12), 20)).value(ctx, ctx.unit(10))(0) == (20, 22) assert chain.chain.map(lambda x,y : x+y, ctx.chain(ctx.unit(12)).put(20).value()).value(ctx, ctx.unit(10))(0) == (20, 22) assert chain.chain.map(lambda x,y,z : [x,y,z], ctx.unit(12), ctx.chain(ctx.unit(13)).put(20).value()).value(ctx, ctx.unit(11))(0) == (20, [11, 12, 13]) ctx = ListF() assert chain.chain.map(lambda x : x+1).value(ctx, [10,20,30]) == [11,21,31] assert chain.chain.map(lambda x,y : x+y, [7,8,9]).value(ctx, [10,20,30]) == [17, 18, 19, 27, 28, 29, 37, 38, 39] assert chain.chain.map(lambda x,y,z : [x,y,z], [7,8,9], ["a", "b"]).value(ctx, [10,20,30]) == [[10, 7, 'a'], [10, 7, 'b'], [10, 8, 'a'], [10, 8, 'b'], [10, 9, 'a'], [10, 9, 'b'], [20, 7, 'a'], [20, 7, 'b'], [20, 8, 'a'], [20, 8, 'b'], [20, 9, 'a'], [20, 9, 'b'], [30, 7, 'a'], [30, 7, 'b'], [30, 8, 'a'], [30, 8, 'b'], [30, 9, 'a'], [30, 9, 'b']]