🐈 Felis Catus – functional bits for Python
Project description
🐈 Felis Catus
Felis Catus is your taxonomic nomenclature, an endothermic quadruped, carnivorous by nature; your visual, olfactory, and auditory senses contribute to your hunting skills and natural defenses. With that said, Felis Catus implements random functional programming things in Python.
Installation
Install from PyPI:
pip install felis-catus
Build and install from source:
pip install git+https://github.com/LeeeeT/felis
Examples
Currying and uncurrying functions with felis.currying
:
from felis.currying import curry, uncurry
@curry
@curry
def curried(a: int, b: str, c: bool) -> None:
pass
uncurried = uncurry(uncurry(curried))
reveal_type(curried) # (bool) -> ((str) -> ((int) -> None))
reveal_type(uncurried) # (int, str, bool) -> None
Safe error handling with felis.either
:
from felis import either
safe_int = either.catch(ValueError)(int)
@either.catch(ZeroDivisionError)
def safe_reciprocal(number: float) -> float:
return 1 / number
safe_reciprocal_of_str = either.compose(safe_reciprocal)(safe_int)
match safe_reciprocal_of_str(input("Enter a number: ")):
case either.Left(error):
print(f"Error: {error}")
case either.Right(reciprocal):
print(f"Reciprocal: {reciprocal}")
Managing IO (or any other lazy computations) with felis.lazy
:
from felis.lazy import bind, take_after
main = \
take_after(lambda: print("What's your name?"))(
bind(input)(lambda name:
lambda: print(f"Hi, {name}!")
))
main()
Finding pythagorean triples (analogue to list comprehension) with felis.list
:
from felis.list import bind, guard, identity, range, take_after
pythags = \
bind(range(1)(20))(lambda z:
bind(range(1)(z))(lambda x:
bind(range(x)(z))(lambda y:
take_after(guard(x**2 + y**2 == z**2))(
identity((x, y, z))
))))
print(pythags)
# [(3, 4, 5), (6, 8, 10), (5, 12, 13), (9, 12, 15), (8, 15, 17)]
Parsing a list of natural numbers from a string with felis.parser
:
from felis.parser import bracket, digit, map, run, separated, some, text
natural = map(int)(map("".join)(some(digit)))
naturals_without_brackets = separated(text(", "))(natural)
naturals_with_brackets = bracket(text("["))(text("]"))(naturals_without_brackets)
string = "[12, 345, 6789]"
result = run(naturals_with_brackets)(string)
print(result) # Some(value=[12, 345, 6789])
That's all monads, btw. 🐈
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
File details
Details for the file felis_catus-0.dev4.tar.gz
.
File metadata
- Download URL: felis_catus-0.dev4.tar.gz
- Upload date:
- Size: 16.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1464af8592eab632a33540f99a2ec6ba3ecbe71d943f251f452f0287446ec048 |
|
MD5 | ffd30cadbdb636a43d4af1dfe069c952 |
|
BLAKE2b-256 | edb5ebab0b1e123442f1382807894f4e075c62ec221f76ab9f9cc83e90e3fc28 |
File details
Details for the file felis_catus-0.dev4-py3-none-any.whl
.
File metadata
- Download URL: felis_catus-0.dev4-py3-none-any.whl
- Upload date:
- Size: 28.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c58abe31fff057e2ec30f9f8730e83e5c00a64144b59d3757275e4e66c97cbf3 |
|
MD5 | 67fb95591799eefec8121568f992613e |
|
BLAKE2b-256 | 1fbc87004dde293292fd42d4ac3728b8cf7f8d736cc6aa4b67c54390d79430f6 |