# map: aplicar

def map_list(f, l):
    "map sobre llistes"
    r = []
    for e in l:
        er = f(e)
        r.append(er)
    return r

def map_iter(f, it):
    "map sobre iteradors"
    for e in it:
        er = f(e)
        yield er

# filter: filtrar

def filter_list(p, l):
    "filter sobre llistes"
    r = []
    for e in l:
        if p(e):
            r.append(e)
    return r

def filter_iter(p, it):
    "filter sobre iteradors"
    for e in it:
        if p(e):
            yield e

# reduce: sintetitzar

def reduce_list(f, l, ini):
    "reduce sobre llistes"
    r = ini
    for e in l:
        r = f(r, e)
    return r
    
def reduce_iter(f, it, ini):
    "reduce sobre iteradors"
    r = ini
    for e in it:
        r = f(r, e)
    return r
        
