Skip to main content
Pre-release

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)

Source distribution for felis-catus 0.dev5
File Size Uploaded
felis_catus-0.dev5.tar.gz 20.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for felis-catus 0.dev5
File Interpreter ABI Platform
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 log

Release 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
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page