This release is a pre-release and may not be stable for production use.
🐈 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 (and evaluating) an arithmetic expression with felis.parser:
from felis.option import Some
from felis.parser import *
literal = map(int)(map("".join)(some(digit)))
factor = lambda string: bracket(character("("))(character(")"))(expression)(string)
term_priority_1 = add(literal)(factor)
multiplication = take_after(character("*"))(identity(lambda a: lambda b: a * b))
division = take_after(character("/"))(identity(lambda a: lambda b: a / b))
term_priority_2 = chain_left_1(add(division)(multiplication))(term_priority_1)
addition = take_after(character("+"))(identity(lambda a: lambda b: a + b))
subtraction = take_after(character("-"))(identity(lambda a: lambda b: a - b))
term_priority_3 = chain_left_1(add(subtraction)(addition))(term_priority_2)
expression = term_priority_3
while string := input("> "):
match run(expression)(string):
case None:
print("Syntax error")
case Some(result):
print("Result:", result)
That's all monads, btw. 🐈
Metadata
Release files for felis-catus 0.dev5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| felis_catus-0.dev5.tar.gz | 20.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| felis_catus-0.dev5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.5 kB
Release files / felis_catus-0.dev5.tar.gz
| Download URL | felis_catus-0.dev5.tar.gz |
|---|---|
| Size | 20.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a43fb1fb761313605b20aa34ade40c5d5fd749b6afa49ffd34be2f8f62a0235f
|
|
BLAKE2b-256 checksum How to use checksums |
8e9210d313ef06b127e84c779bc51fb731f5ae123c072b3063bb9fcd6e953de1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 15, 2025.
Transparency logRelease files / felis_catus-0.dev5-py3-none-any.whl
| Download URL | felis_catus-0.dev5-py3-none-any.whl |
|---|---|
| Size | 35.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0b64f81ca2d38973e16b41679ebc2c63186d4c1194972033b0710b329a1d91d2
|
|
BLAKE2b-256 checksum How to use checksums |
08d6682cb97afe269e2cc91134559fd5a97ef5b0e8e453ce14fc821e1a2300d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 15, 2025.
Transparency log