from functools import partial from pyfunc.curry import curry_n identity = lambda x: x class NotMatch(Exception): pass def not_match(x): raise NotMatch(x) match = lambda check, obj: obj if check(obj) else not_match(obj) match_curry = curry_n(match, 2) instance_of = lambda type_: match_curry(lambda obj: isinstance(obj, type_)) is_int = instance_of(int) is_array_of = lambda matcher: match_curry(lambda obj: all(map(matcher, obj))) is_array_of_int = is_array_of(is_int) def hd_tl(match_x, match_xs, arr): x, *xs = arr return match_x(x), match_xs(xs) hd_tl_identity = partial(hd_tl, identity, identity)
from pyfunc.curry import curry_n from pyfunc.pattern_match import ( pattern_match, hd_tl_partial, is_blank, identity, match_curry, ) r_map = lambda fn, arg: pattern_match(( (hd_tl_partial(identity, is_blank), lambda arr: [fn(arr[0])]), ( hd_tl_partial(identity, identity), lambda arr: [fn(arr[0])] + r_map(fn, arr[1]) ), ), arg) r_map_curry = curry_n(r_map, 2) twice = r_map_curry(lambda x: x * 2) is_none = match_curry(lambda obj: obj is None) pair = lambda match_x, match_y: lambda arr: (match_x(arr[0]), match_y(arr[1])) def r_map_tail(fn, arg): aux = lambda arg: pattern_match(( (pair(identity, is_none), lambda arr: aux([arr[0], []])), ( pair(hd_tl_partial(identity, is_blank), identity), lambda arr: arr[1] + [fn(arr[0][0])] ), ( pair(hd_tl_partial(identity, identity), identity), lambda arr: aux([arr[0][1], arr[1] + [fn(arr[0][0])]])