def _get_data_pids(tag_tree): ''' Returns an iterator over data PIDs from metadata ''' def pids(t): ''' Get data 'PIDs' from OAI-DC and IDA ''' for p in t('identifier', recursive=False): yield p.string pids1, pids2 = tee(pids(tag_tree), 2) pred = lambda x: re.search('urn', x, flags=re.I) return chain(filter(pred, pids1), filterfalse(pred, pids2))
def double_evens3(xs): return doubles(filter(even1, xs))
def double_evens2(xs): return doubles(filter(F(eq, 0) << F(flip(mod), 2), xs))
def double_evens1(xs): return doubles(filter(_ % 2 == 0, xs))
def double_evens(xs): return doubles(filter(lambda x: x % 2 == 0, xs))
else: return [] def filter3(pred, xs): return [x for x in xs if pred(x)] def filter4(pred, xs): return reduce(lambda ys, y: ys + [y] if pred(y) else ys, xs, []) # Needs a different data type to be in O(n). Or at least an append which # returns the list. Better would be a list which allows to create a new # list with a given value as head and a given list as tail. falsify("filter vs filter1", lambda xs: list(filter(even, xs)) == filter1(even, xs), [int]) falsify("filter1 vs filter2", lambda xs: filter1(even, xs) == filter2(even, xs), [int]) falsify("filter2 vs filter3", lambda xs: filter2(even, xs) == filter3(even, xs), [int]) falsify("filter3 vs filter4", lambda xs: filter3(even, xs) == list(filter4(even, xs)), [int]) def map4(f, xs): return reduce(lambda ys, y: ys + [f(y)], xs, []) falsify("map3 vs map4", lambda xs: map3(F(mul, 2), xs) == map4(F(mul, 2), xs), [int]) fac2 = F(flip(F(reduce, mul)), 1) << F(range, 1) << F(add, 1)