Skip to content

Instantly share code, notes, and snippets.

@mrange
Created May 14, 2019 21:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrange/01063e614cebd97e531b50c2492e6a39 to your computer and use it in GitHub Desktop.
Save mrange/01063e614cebd97e531b50c2492e6a39 to your computer and use it in GitHub Desktop.
python PS
# (v -> Boolean) -> Boolean
class State:
pass
def empty():
return lambda r: True
def singleton(v):
return lambda r: r(v)
def where(f, ps):
return lambda r: ps(lambda v: r(v) if f(v) else True)
def select(m, ps):
return lambda r: ps(lambda v: r(m(v)))
def collect(m, ps):
return lambda r: ps(lambda v: m(v)(r))
def debug(nm, ps):
def dps(r):
def dr(v):
res = r(v)
print("DEBUG - %s - %s - %s" % (nm, res, v))
return res
ps(dr)
return dps
def fromList(vs):
def ps(r):
for v in vs:
if not r(v):
return False
return True
return ps
def fold(f, z, ps):
st = State()
st.acc = z
def r(v):
st.acc = f(st.acc, v)
return True
ps(r)
return st.acc
def toList(ps):
acc = []
ps(lambda v: acc.append(v) or True)
return acc
def first(ps):
st = State()
st.acc = None
def r(v):
st.acc = v
return False
ps(r)
return st.acc
toList(where(lambda v: v > 2, select(lambda v: v + 1, fromList([1,2,3]))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment