A Simple Tiny (only <100 lines) Algebraic Effects Library for Python.
fromtypingimportAny, Callable, Generator, Optionalfromsimple_effimportEffect, eff, Effnot_integer=Effect()
defparse_int(str: str) ->Optional[int]:
try:
returnint(str)
exceptException:
returnNone@effdefsum_lines(s: str) ->Generator[Eff[str], int, int]:
lines=s.split()
sum=0forlineinlines:
matchparse_int(line):
caseNone:
sum+=yieldnot_integer.perform(line)
casenum:
sum+=numreturnsumdefhandle_notinteger(k: Callable, v: str) ->Any:
print(f"Parse Error: {v} is not an integer.")
returnk(0)
if__name__=="__main__":
twelve=sum_lines("1\n2\nthree\n4\n5")
twelve.on(not_integer, handle_notinteger)
ret=twelve.run()
print(f"Sum: {ret}")This library is ...
- inspired by effective-rust for the API design.
- heavily based on ruff for the implementation.