Skip to main content

aleff

Algebraic effects for Python — deep and shallow, stateful, composable, multi-shot handlers.

Doc | PyPI | GitHub

from aleff import effect, create_handler

choose = effect("choose")
h = create_handler(choose)

@h.on(choose)
def _(k, *values):
    return sum((k(v) for v in values), [])

print(h(lambda: [choose("A", "B") + choose("C", "D")]))
# ['AC', 'AD', 'BC', 'BD']

Features

  • Deep handlers — effects propagate through nested function calls without annotation
  • Shallow handlers — handle an effect once, then delegate re-installation to the handler function; enables state machines, shift0/reset0, and strategy changes between invocations
  • Stateful handlers — handlers can maintain and update state across multiple effect invocations, either via mutable variables (deep) or re-installation with new state (shallow); enables get/put state, transactions, and reverse-mode AD
  • Multi-shot continuationsresume can be called multiple times in a single handler, enabling backtracking search, non-determinism, and other advanced patterns
  • Sync and async — both synchronous (Handler) and asynchronous (AsyncHandler) handlers are supported, with transparent bridging between the two
  • Effect composition — handler functions can perform effects themselves, dispatched to enclosing handlers; enables layered architectures and modular effect stacking
  • Dynamic windwind context manager establishes before/after guards that are re-invoked on multi-shot re-entry, with optional auto-management of context managers returned by before
  • Effect annotation@effect(step1, step2) collects effect sets transitively from decorated functions
  • Introspectioneffects(fn) and unhandled_effects(fn, h) for querying and validating effect coverage
  • Typed — effect parameters and return types are checked by type checkers (pyright)
  • No macros, no code generation — pure Python library built on greenlet and a small CPython C extension

Requirements

  • CPython >=3.12
    • Tested versions:
      • 3.12.13
      • 3.13.12
      • 3.14.3
      • 3.14.3t (free-threaded)
  • greenlet >= 3.3.2
  • Linux / macOS / Windows

Installation

# uv
uv add aleff

# pip
pip install aleff

Quick start

from aleff import effect, Effect, Resume, create_handler

# Define effects
read: Effect[[], str] = effect("read")
write: Effect[[str], int] = effect("write")

# Write business logic using effects
def run():
    s = read()
    return write(s)

# Provide handler implementations
h = create_handler(read, write)

@h.on(read)
def _read(k: Resume[str, int]):
    return k("file contents")

@h.on(write)
def _write(k: Resume[int, int], contents: str):
    print(f"writing: {contents}")
    return k(len(contents))

result = h(run)
print(result)  # 13

Multi-shot example

from aleff import effect, Effect, Handler, Resume, create_handler

choose: Effect[[int], int] = effect("choose")

h: Handler[list[int]] = create_handler(choose)

@h.on(choose)
def _choose(k: Resume[int, list[int]], n: int):
    # Resume once for each choice and collect all results
    results: list[int] = []
    for i in range(n):
        results += k(i)
    return results

def computation():
    x = choose(3)  # 0, 1, or 2
    y = choose(2)  # 0 or 1
    return [x * 10 + y]

result = h(computation)
print(result)  # [0, 1, 10, 11, 20, 21]

Effect composition

Handler functions can perform effects that are handled by enclosing handlers:

from aleff import effect, Effect, Resume, create_handler

log: Effect[[str], None] = effect("log")
parse: Effect[[str], int] = effect("parse")

# Outer handler: logging
h_log = create_handler(log)

@h_log.on(log)
def _log(k: Resume[None, int], msg: str):
    print(f"[LOG] {msg}")
    return k(None)

# Inner handler: parsing with logging
h_parse = create_handler(parse)

@h_parse.on(parse)
def _parse(k: Resume[int, int], s: str):
    log(f"parsing: {s}")       # handled by the outer handler
    return k(int(s))

result = h_log(lambda: h_parse(lambda: parse("42") + 1))
# prints: [LOG] parsing: 42
print(result)  # 43

Dynamic wind

The wind context manager establishes before/after guards around a dynamic extent. When a multi-shot continuation captured inside the with block is resumed, the before thunk is called again; when it exits, the after thunk runs.

from aleff import effect, Effect, Resume, Handler, create_handler, wind

choose: Effect[[], int] = effect("choose")
h: Handler[list[int]] = create_handler(choose)

@h.on(choose)
def _choose(k: Resume[int, list[int]]):
    return k(1) + k(2)

log: list[str] = []

def run() -> list[int]:
    with wind(lambda: log.append("before"), lambda: log.append("after")):
        return [choose() * 10]

result = h(run)
print(result)  # [10, 20]
print(log)     # ['before', 'after', 'before', 'after']

If before returns a context manager and auto_exit=True (the default), __enter__ and __exit__ are called automatically:

with wind(lambda: open("data.txt")) as ref:
    ref.unwrap().read()
# file is closed on exit

wind_range is a multi-shot-safe replacement for range() in for loops. Python's range() iterator is shared across shots and exhausted after the first; wind_range saves and restores the iterator position automatically:

with wind_range(n) as r:
    for i in r:
        v = choose()  # multi-shot safe

How it works

Effects are declared as typed values and invoked like regular function calls. A Handler intercepts these calls via greenlet-based context switching:

  1. Business logic runs in a greenlet
  2. When an effect is invoked, control switches to the handler
  3. The handler processes the effect and calls resume(value) to return a value
  4. If resume is called multiple times, each call restores a snapshot of the continuation's frames (multi-shot)
  5. If the handler returns without calling resume, the computation is aborted (early exit)

Because handlers use greenlets (not exceptions), the control flow is:

  • Transparent — no yield, await, or special syntax in business logic
  • Non-stack-cutting — code after resume in the handler runs after the continuation completes, enabling reverse-order execution (useful for backpropagation, transactions, etc.)

Multi-shot continuations are implemented via a CPython C extension (aleff._multishot.v1._aleff) that snapshots and restores interpreter frame chains.

Package structure

Package Description
aleff Default: re-exports aleff.multishot (multi-shot handlers)
aleff.multishot Multi-shot handlers with frame snapshot/restore
aleff.oneshot One-shot handlers (no C extension required)

Examples

See examples/ for demonstrations:

  • N-Queens — backtracking search via multi-shot continuations
  • Amb / Logic puzzle — Scheme-style amb operator and constraint solving (SICP Exercise 4.42)
  • Probability — exact discrete probability distributions via weighted multi-shot
  • Dependency injection — swap DB/email/logging implementations
  • Record/Replay — record effect results, replay without side effects
  • Transactions — buffer writes, commit on success, rollback on failure
  • Automatic differentiation — forward-mode (dual numbers) and reverse-mode (backpropagation) with the same math expressions
  • Shallow state machine — mutable state (get/put) and traffic light controller via shallow handler re-installation
  • shift/reset, shift0/reset0 — delimited continuations: deep = shift/reset, shallow = shift0/reset0, with generator example

API reference

Function / Class Description
effect("name") Create a new Effect
@effect(e1, e2, ...) Decorate a function to declare its effects
create_handler(*effects, shallow=False) Create a synchronous handler
create_async_handler(*effects, shallow=False) Create an asynchronous handler
h.on(effect) Register a handler function (decorator)
h(caller) Run caller with the handler active
effects(fn) Get the declared effect set of a function
unhandled_effects(fn, *handlers) Get effects not covered by the given handlers
Effect[P, R] Effect protocol (parameters P, return type R)
Handler[V] Sync handler protocol
AsyncHandler[V] Async handler protocol
Resume[R, V] Sync continuation (k(value) -> V)
ResumeAsync[R, V] Async continuation (await k(value) -> V)
wind(before, after, *, auto_exit=True) Dynamic wind context manager
wind_range(stop) / wind_range(start, stop, step) Multi-shot-safe range() for for loops
Ref[T] Reference wrapper returned by wind; call unwrap() to get the value

Development

From source:

git clone https://github.com/hnmr293/aleff.git
cd aleff
uv sync
# Run tests
uv run pytest

# Run tests on all supported Python versions
./run_tests.sh

# Format
uv run ruff format

# Lint
uv run pyright

License

Apache-2.0

Download files

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

Source Distribution

aleff-0.4.0.tar.gz (294.0 kB view details)

Uploaded Source

Built Distributions

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

aleff-0.4.0-cp314-cp314t-win_amd64.whl (311.1 kB view details)

Uploaded CPython 3.14tWindows x86-64

aleff-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl (335.4 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

aleff-0.4.0-cp314-cp314t-macosx_10_15_x86_64.whl (336.1 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

aleff-0.4.0-cp314-cp314-win_amd64.whl (303.8 kB view details)

Uploaded CPython 3.14Windows x86-64

aleff-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (949.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.4.0-cp314-cp314-macosx_11_0_arm64.whl (318.7 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

aleff-0.4.0-cp314-cp314-macosx_10_15_x86_64.whl (321.5 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

aleff-0.4.0-cp313-cp313-win_amd64.whl (305.3 kB view details)

Uploaded CPython 3.13Windows x86-64

aleff-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (949.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (316.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

aleff-0.4.0-cp313-cp313-macosx_10_13_x86_64.whl (319.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

aleff-0.4.0-cp312-cp312-win_amd64.whl (305.3 kB view details)

Uploaded CPython 3.12Windows x86-64

aleff-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (941.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (312.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

aleff-0.4.0-cp312-cp312-macosx_10_13_x86_64.whl (315.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

Details for the file aleff-0.4.0.tar.gz.

File metadata

  • Download URL: aleff-0.4.0.tar.gz
  • Upload date:
  • Size: 294.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aleff-0.4.0.tar.gz
Algorithm Hash digest
SHA256 ef1e1cbd25f77449ad1aa97283bf8cdb76e135d07be7fe058b3f0c386aaa4631
MD5 6debc3f83427681c93367c6577b079e7
BLAKE2b-256 f431da4aabe4fd8ddcc35c2d72f6b9c3e2fedce5fddb84f2de91041aa2927319

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0.tar.gz:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: aleff-0.4.0-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 311.1 kB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aleff-0.4.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 a732fbea61f35fd88c646cae40183590a8973c39045d040748ccd9b2713f99ff
MD5 e29b5a8677a229ef9c7acbbeaf90d425
BLAKE2b-256 e7c17343818480f112e6b477346fe33b13a451e90f255b42ed549ecad032cb5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314t-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 75aff10de8a828763069e0bc161b60d1ca4e4c21734d9bdc23962d513e3d3868
MD5 72e6800684d9922b5f29c79e797a4d96
BLAKE2b-256 6000e0d9c0081e1ed0ea3b15093f0514eab9a54fb0d45d35d84be399353a1436

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c30abe3880d0fbaf27596ed979e712cd0dcb01df3e2452a2cfbec97b53e5d84
MD5 2d502928b6247bff675ee6dc65e932c3
BLAKE2b-256 0a46d222f4570d9d71c516828a528ba57cf09454cde9fc8761699cc73b1d7cf8

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b713066457fd6ce5ebe0d505408336e13f4feaeac14464f8a78a653807f4b54f
MD5 7c86871cfef9f7d409a5fbf3933a3f33
BLAKE2b-256 f915811db880d5a3e64999898a2ec05b1b022efa7a34eb5c9c7de8b4f87bffca

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314t-macosx_10_15_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: aleff-0.4.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 303.8 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aleff-0.4.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 beeee57b8ef600addabd2cfaa2f50288482f8763ae512936cab61fc1608a60bf
MD5 fedf58a8a2d4c910ad4dd65f56c3d981
BLAKE2b-256 804bece99e363a48a21dd891606fe86ebeed067241f5289f527a25e47aa3be14

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c68dc71ad32c6d0ee843270f218fb0190adc253b6c09236f6b10778658c1a88e
MD5 401e86a2116b1b62a22deaad5f1df6ae
BLAKE2b-256 726803193612078404153cbdd055939a1eb172edf98f5d7f0b616546f13739fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6caac56d5e747576e14f1c0f186d1f27d2dcc122ab355bb93e1da44a72f99a1e
MD5 406f43a7d82213ec02ae371ba424276e
BLAKE2b-256 5da6cce96cad70305989d73215fe6e4db5ef656620cf936b5e48308924fab407

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 1d2a806c8b6416841dac930cd2a33ab7923342967f8ad5f7bbf2ff902fc5da2e
MD5 77630d163dca8a9def162b3d05794208
BLAKE2b-256 3bfe9fe0acff639210a2758805417fd059cc3cf1bd6f01052116c66d008634f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp314-cp314-macosx_10_15_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: aleff-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 305.3 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aleff-0.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5127e96de719b8dbd3fcea10f2d6083d2456dad55a98d7b8aee382bcc712e6d9
MD5 e546ac6cee28e9c8b589b0183706415e
BLAKE2b-256 89bfa0759a54713541a1ceb5887bdf94a5dbc32d64c5e485cdd2701b18398541

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 baef5a0ca7ec101d790a1759cd97d85bda6dc531006756914fb24bfabd0cde52
MD5 149a69649f2e4e38c4a94a8a171be0a5
BLAKE2b-256 7fcee5634ccba5fa708edaf5b743800a5efbd4c33847ed5ff682a5b4a97b101f

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66729c10bc7330347c128c7ef5dbd2531b0204e64f3794f7e975d7f1cd7c601e
MD5 2a5282dbd452b76c0e790e3f1af74c86
BLAKE2b-256 20a8c8808bd61cb86dbd04329b5272f4796afadb34ace08f4ea55ea91d6dec45

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c32c29bbd197d677ffe2e70209d2f49d34184ca4b7a2d77ce16fc809cec79722
MD5 15a5b4b28592e8c8bc2783a8ac576ae0
BLAKE2b-256 2bfdc770590f8f20519eae7ca21dd618c4535051190934937230fc75740b469a

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: aleff-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 305.3 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for aleff-0.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ab9ac3e3fa4ca9244d3d803b438ac0814f5644684855fea21b4bfd03a20541b5
MD5 a41f9540884bc01610bde0c2830f78da
BLAKE2b-256 12085f924137949783a0ce1aca89b26fb614a17798b50036dedc13c18379dbb8

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 002f4fe927b70982141a84731437541cf0dc169e3ef543dcc1ce182c01570c7c
MD5 cdb44c61d474a54f5ce9bb9eefdac8b8
BLAKE2b-256 5944da60eb330b5cdbc9aa1e3e42772db9bf091c814fced0d7c2678ca46c9f75

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c83bad6cea14a8beea6c56b837d74d3d1f8bdc3cdcaefaf6572287c1431a3d35
MD5 3216c0e7c6d398c63a3976d845782c19
BLAKE2b-256 35f7f1dffb6a599bad89cea000aee54e6dc84b12630663e7d3c38e56725b32f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

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

File details

Details for the file aleff-0.4.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.4.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 73033addec49f27bb6f5eab4738fc32c28d968ac339c0f5497b70c5ea9609ce8
MD5 7df6f365b4a33535f63aff71ebea4d7d
BLAKE2b-256 e2321bf3a3461e4430f15fa2d77748d06a3471fa301ca8c2c831adf858ad6920

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.4.0-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

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

Release history Release notifications | RSS feed

0.5.0

17 files

0.4.1

17 files

This release

0.4.0 This release

17 files

0.3.2

17 files

0.3.1

17 files

0.3.0

13 files

0.2.0

9 files

0.1.0

1 file

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