Skip to main content

Rustipy your python project

Project description

Rustipy

Introduction

This package introduces Option and Result, which are basic functional monad types, to your project!

Installation

pip install rustipy

Usage

Result example

check the test file for more examples

from rustipy.result import Result, Ok, Err

def square(x: int) -> int:
    return x * x

def ok_if_positive(x: int) -> Result[int, str]:
    if x > 0:
        return Ok(x)
    else:
        return Err("Not positive")

def err_to_default_ok(e: str) -> Result[int, str]:
    return Ok(DEFAULT_VALUE)

def len_str(s: str) -> int:
    return len(s)

OK_VALUE = 100
DEFAULT_VALUE = 0

def test_flatten():
    ok_ok: Result[Result[int, str], str] = Ok(Ok(OK_VALUE))
    ok_err: Result[Result[int, str], str] = Ok(Err(ERR_VALUE))
    err_outer: Result[Result[int, str], str] = Err(OTHER_ERR_VALUE)
    ok_not_result: Result[int, str] = Ok(123)

    assert ok_ok.flatten() == Ok(OK_VALUE)
    assert ok_err.flatten() == Err(ERR_VALUE)
    assert err_outer.flatten() == Err(OTHER_ERR_VALUE)

    with pytest.raises(TypeError):
        ok_not_result.flatten()

def test_chaining_err_path():
    res = (
        Ok(-5)
            .map(square)
            .and_then(ok_if_positive) # Ok(25)
            .and_then(err_if_negative) # Ok(25)
            .and_then(lambda x: Err("Force Err")) # Err("Force Err")
            .or_else(err_to_default_ok) # Ok(DEFAULT_VALUE)
            .unwrap()
    )
    assert res == DEFAULT_VALUE

Option example

check the test file for more examples

from rustipy.option import Option, Some, NONE
from tests.test_result import OK_VALUE

def int_to_some_str(x: int) -> Option[str]:
    return Some(str(x))

def int_to_nothing_if_odd(x: int) -> Option[int]:
    return NONE if x % 2 != 0 else Some(x)

def int_to_some_str(x: int) -> Option[str]:
    return Some(str(x))

def int_to_nothing_if_odd(x: int) -> Option[int]:
    return NONE if x % 2 != 0 else Some(x)

SOME_VALUE = 123

def test_and_then():
    some_even: Option[int] = Some(10)
    some_odd: Option[int] = Some(5)
    nothing: Option[int] = NONE

    assert some_even.and_then(int_to_some_str) == Some("10")
    assert some_odd.and_then(int_to_some_str) == Some("5")
    assert nothing.and_then(int_to_some_str) == NONE

    assert some_even.and_then(int_to_nothing_if_odd) == Some(10)
    assert some_odd.and_then(int_to_nothing_if_odd) == NONE
    assert nothing.and_then(int_to_nothing_if_odd) == NONE

def test_inspect():
    inspected_val = None
    def inspector(x: int):
        nonlocal inspected_val
        inspected_val = x * 2

    some: Option[int] = Some(SOME_VALUE)
    nothing: Option[int] = NONE

    assert some.inspect(inspector) is some # Returns self
    assert inspected_val == SOME_VALUE * 2

    inspected_val = None # Reset
    assert nothing.inspect(inspector) is nothing # Returns self
    assert inspected_val is None

def test_type_guards():
    some: Option[int] = Some(OK_VALUE)
    nothing: Option[int] = NONE

    if is_some(some):
        assert some.unwrap() == OK_VALUE
    else:
        pytest.fail("is_some failed for Some value")

    if is_nothing(some):
        pytest.fail("is_nothing succeeded for Some value")

    if is_some(nothing):
        pytest.fail("is_some succeeded for Nothing value")

    if is_nothing(nothing):
        # Can't unwrap Nothing, just check identity
        assert nothing is NONE
    else:
        pytest.fail("is_nothing failed for Nothing value")

Distribution Steps

  1. Make some changes
  2. Increment the version at [project] section in [pyproject.toml]
  3. Commit the changes
  4. Build the package
$ uv build
  1. Tag the release
$ git tag -vX.X.X
$ git push origin vX.X.X

Done

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rustipy-0.2.1.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rustipy-0.2.1-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file rustipy-0.2.1.tar.gz.

File metadata

  • Download URL: rustipy-0.2.1.tar.gz
  • Upload date:
  • Size: 7.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rustipy-0.2.1.tar.gz
Algorithm Hash digest
SHA256 62cff44095d02e373488d41c5f03ca1b00d22cf473f01373f335d767409f4bbf
MD5 baa438ab1a46581d422680f4cb70cc2d
BLAKE2b-256 c8e0bbe5f6c90e64a305fa76956d5f698d9608c9ef7ce94e00b1f826296e1929

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustipy-0.2.1.tar.gz:

Publisher: release.yml on loldruger/Rustipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rustipy-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: rustipy-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 9.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rustipy-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 17dd216dff5f7fa07fd9bed85c215d1c2e976f98cac1111dca671bb4d2b2c795
MD5 0c915620a610b08447e467e9c7847fc0
BLAKE2b-256 56d83a5875b29b846d263b9b8a81ed97ac89fba62cf70ce213d643afdf4c26b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rustipy-0.2.1-py3-none-any.whl:

Publisher: release.yml on loldruger/Rustipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page