Easy to use monads (containers) that improve the quality of your python code. Use Just to end checking for None, Success to end unhandled exceptions, Future for async, and Reader for dependencies.
Project description
simplemonads
Easy to use monads (containers) that improve the quality of your python code. Use Just
to end checking for None, Success
to end unhandled exceptions, Future
for async, and Reader
for dependencies.
Platform support
Just pip install simplemonads
and you're done. You can also download this single file into your project and use it as you wish without dependencies. Works across all platforms, so CPython >= 3.5 (Windows, Linux, Mac, Android, iOS), in a single standalone html file, multiple files in the browser with dynamic loading, and even on microcontrollers with micropython!
Example GUI using monads: Success
, Failure
, Just
, Reader
, and Printer
import simplemonads as sm
try:
from typing import Callable, Protocol, Union, Any
class Deps(Protocol):
"Dependencies for your application"
def popup(self, msg) -> None:
"Display a popup with the specified message."
import PySimpleGUI
except:
pass
def make(make_gui: "Callable[[],PySimpleGUI]") -> "Callable[[],Deps]":
gui = make_gui()
class GuiDeps:
def popup(self, x: str):
gui.Popup(x)
return GuiDeps
def app(divide_by_zero: bool = False) -> sm.Reader:
data = sm.Success(sm.Just(7))
double = lambda x: x + (lambda y: y * 2)
triple = lambda x: x + (lambda y: y * 3)
result = data + triple + double
if divide_by_zero:
result += lambda x: x + (lambda x: x / 0)
def effect(deps: "Deps") -> "sm.Monad":
msg = "Answer to the Universe: "
err = "Whoops, an error happened: "
result | {
sm.Success: lambda x: x | {sm.Just: lambda val: deps.popup(msg + str(val))},
sm.Failure: lambda x: deps.popup(err + x),
}
return result
return sm.Reader(effect)
@sm.run
def main():
lib = sm.Success() + (lambda x: __import__("PySimpleGUI"))
gui = lib | {sm.Success: lambda x: x, sm.Failure: lambda x: sm.Printer()}
return app() + make(lambda: gui)
Handling exceptions
To demonstrate exception handling the above example can be changed to:
return app(divide_by_zero=True) + make(lambda: gui)
This will result in safely handling the divide by zero exception and will run the following without interrupting the flow of the application:
sm.Failure: lambda x: deps.popup(err + x),
Example monad Future
from simplemonads import Future
async def effect(data=1):
import asyncio
await asyncio.sleep(0.1)
return data ** data
assert Future(2) | { Future: lambda x: x } == 2
assert Future(2) + effect | { Future: lambda x: x } == 4
assert Future(2) + effect + effect | { Future: lambda x: x } == 256
This allows easily adding async functions into the monadic pipeline. If you need special concurrency options, you can await multiple tasks from inside the effect function.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for simplemonads-1.0.9-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 363d9c63e1acde850bcb8c25692f029c532965b9a2c98559198bede3f50c4bb8 |
|
MD5 | ba14cef89eaed1312a2b85a40a225a2f |
|
BLAKE2b-256 | ddef5f926f862570bf3de8e66f96a3dce330ec9c102c36241941a6cd68302e42 |