# # From the great idea of https://stackoverflow.com/a/24831722/7092558 # with some changes and tweaks. # # Example: # myList = range(20) # ret = compose( # myList, # filterBy(lambda n: n%2==0), # mapBy(lambda n: "even "+str(n)), # reduceBy(lambda sa, sb: sa+"\n"+sb) # ) # assert(ret == 'even 0\neven 2\neven 4\neven 6\neven 8\neven 10\neven 12\neven 14\neven 16\neven 18') # import functools def compose(arg, *functions): return generalCompose(*functions)(arg) def generalCompose(*functions): return functools.reduce(lambda f, g: lambda x: f(g(x)), reversed(functions)) def mapBy(map_fn): return functools.partial(map, map_fn) def filterBy(filter_fn): return functools.partial(filter, filter_fn) def reduceBy(reduce_fn): return functools.partial(functools.reduce, reduce_fn) def const(a): return lambda x: a def find(predicate): def _find(iterable): for l in iterable: if predicate(l): return l return None return _find def _alpt_testCompose(): myList = range(20) ret = compose( myList, filterBy(lambda n: n%2==0), mapBy(lambda n: "even "+str(n)), reduceBy(lambda sa, sb: sa+"\n"+sb) ) assert(ret == 'even 0\neven 2\neven 4\neven 6\neven 8\neven 10\neven 12\neven 14\neven 16\neven 18') def _alpt_testFind(): a = range(20) assert compose(a, filterBy(lambda n: n%2), find(lambda n: n == 7)) == 7 ### _alpt_testCompose() _alpt_testFind()