def test_mutating_bind_and_map(self): add = lambda a: lambda b: a + b addT = lambda a: lambda b: Thunk(a + b) t = Thunk(1) t.bind(addT(2)) t.map(add(1)) self.assertThunksEqual(t, Thunk(4))
def do(exp, **kwargs): load = Thunk({}) def loadKeypair(k, v): return v.map(lambda v: {k: v}) def apply(load, k, v): load.bind(lambda ls: loadKeypair(k, v).map(lambda p: dict(ls, **p))) for k, v in kwargs.iteritems(): apply(load, k, v) return load.bind(lambda ls: exp(**ls))
def test_mutating_bind_maps(self): t = Thunk(1) t.bind(lambda x: Thunk(1).map(lambda _: x)) t.bind(lambda x: Thunk(1).map(lambda _: x)) self.assertThunksEqual(t, Thunk(1)) t = Thunk(1) ts = [Thunk(1), Thunk(1)] t.bind(lambda x: ts[0].map(lambda _: x)) t.bind(lambda x: ts[1].map(lambda _: x)) self.assertThunksEqual(t, Thunk(1)) t = Thunk(1) ts = {'a': Thunk(1), 'b': Thunk(1)} t.bind(lambda x: ts['a'].map(lambda _: x + 1)) t.bind(lambda x: ts['b'].map(lambda _: x + 1)) self.assertThunksEqual(t, Thunk(3)) t = Thunk({}) ts = {'a': Thunk(1), 'b': Thunk(1)} t.bind(lambda x: ts['a'].map(lambda v: dict(x, **{'a': v}))) t.bind(lambda x: ts['b'].map(lambda v: dict(x, **{'b': v}))) self.assertThunksEqual(t, Thunk({'a': 1, 'b': 1})) t = Thunk({}) ts = {'a': Thunk(1), 'b': Thunk(1)} k = 'a' t.bind(lambda x: ts[k].map(lambda v: dict(x, **{k: v}))) k2 = 'b' t.bind(lambda x: ts[k2].map(lambda v: dict(x, **{k2: v}))) self.assertThunksEqual(t, Thunk({'a': 1, 'b': 1})) t = Thunk({}) ts = {'a': Thunk(1), 'b': Thunk(1)} def apply(t, k, v): t.bind(lambda x: ts[k].map(lambda v: dict(x, **{k: v}))) for k, v in ts.iteritems(): apply(t, k, v) self.assertThunksEqual(t, Thunk({'a': 1, 'b': 1}))