112 lines
1.7 KiB
Python
112 lines
1.7 KiB
Python
|
|
def zipWith(f,ls,xs):
|
|
for i in range(len(ls)):
|
|
yield f(ls[i],xs[i])
|
|
|
|
def all(f, ls):
|
|
for x in ls:
|
|
if not f(x): return False
|
|
return True
|
|
|
|
def splitWhen(f, ls):
|
|
b, rs, xs = False, [], []
|
|
for x in ls:
|
|
if f(x): b = True
|
|
if b: xs += [x]
|
|
else: rs += [x]
|
|
return rs, xs
|
|
|
|
def tail(ls):
|
|
return list(ls)[1:]
|
|
|
|
def take(n,ls):
|
|
for x in ls:
|
|
if n < 1: break
|
|
yield x
|
|
n -= 1
|
|
|
|
def drop(n,ls):
|
|
for x in ls:
|
|
if n < 1: yield x
|
|
n -= 1
|
|
|
|
def splitAt(i, ls):
|
|
ls = list(ls)
|
|
return ls[:i], ls[i:]
|
|
|
|
def partBy(n, ls):
|
|
rs = []
|
|
while len(ls) >= n:
|
|
xs, ls = splitAt(n,ls)
|
|
rs.append(list(xs))
|
|
return rs
|
|
|
|
def concat(ls):
|
|
for xs in ls:
|
|
for x in xs:
|
|
yield x
|
|
|
|
|
|
def dropWhile(f, ls):
|
|
b = False
|
|
for x in ls:
|
|
if not b:
|
|
if f(x): continue
|
|
else:
|
|
b = True
|
|
if b:
|
|
yield x
|
|
|
|
def unfold(f, x):
|
|
"""
|
|
def f(x):
|
|
if x > 0: return x, x-1
|
|
|
|
print(list(unfold(f, 5)))
|
|
"""
|
|
while True:
|
|
r = f(x)
|
|
if not r: break
|
|
v, x = r
|
|
yield v
|
|
|
|
|
|
def nub(ls):
|
|
rs = []
|
|
for x in ls:
|
|
if x not in rs:
|
|
rs.append(x)
|
|
return rs
|
|
|
|
|
|
def cartProd(ls, xs):
|
|
for i in ls:
|
|
for x in xs:
|
|
if not i is x:
|
|
yield i, x
|
|
|
|
|
|
def numEqPrefix(ls, xs):
|
|
acc = 0
|
|
for i in range(len(ls)):
|
|
try:
|
|
if ls[i] == xs[i]:
|
|
acc += 1
|
|
except:
|
|
break
|
|
return acc
|
|
|
|
|
|
def pairs2list(ls):
|
|
rs = []
|
|
for a, b in ls:
|
|
if not a in rs:
|
|
rs.append(a)
|
|
if not b in rs:
|
|
rs.append(b)
|
|
return rs
|
|
|
|
|
|
|
|
|