Skip to main content

lazily

Lazy reactive primitives for Python — the Cell kernel (Source / Computed cells, plus Effect) with automatic dependency tracking and cache invalidation, plus the language-agnostic lazily-spec wire protocol for mirroring graph state across processes and languages.

PyPI

Overview

lazily is the Python port of the Cell kernel (#lzcellkernel): two value kinds — Source and Computed — plus the value-less Effect sink. Cell is the value node the Source handle is bound to.

  • Source — a value written from outside (set / merge); the writable kind. Construct with source / cell (handle Source, native class Cell, slot SourceSlot / CellSlot). A MergeCell is a Source whose write folds under a non-KeepLatest policy (Cell ≡ Source(KeepLatest)).
  • Computed — a value computed from upstream, via a compute function. Construct with computed(ctx, f). Guarded by default and lazy by default.
  • Effect — a value-less sink outside the hierarchy; nothing can depend on it.

A Computed is lazy by default: dependents are marked dirty on invalidation but only recompute when accessed. When you need eager push-style semantics — recompute immediately, observe v1 → v2 with no unset window — make it eager: computed(ctx, f).eager(). Going eager attaches a scheduled puller Effect over the backing memo (eagerness is graph state — an _eager bit plus a side table — not a distinct type), so N writes inside one batch re-materialize the computed once, at the flush. Every cell is guarded — an equal recompute is suppressed by the PartialEq guard (matching TC39 Signal.Computed), so unchanged values never cascade downstream work. There is no unguarded derived mode: computed is the guarded derived constructor, and the former separate memo construction is retired.

Migration note (v2 Cell kernel, #lzcellkernel). The v1 value vocabulary is removed: Signal / signal / signal_def, formula / formula_def / FormulaCell, SourceCell / SourceCellSlot, and the .drive() / .undrive() / is_driven / is_active methods are gone. Use the v2 spelling instead — an eager Computed is computed(ctx, f).eager(); the lifecycle is .eager() / .lazy() / .is_eager(). The construction sugar cell / cell_def is deprecated in favour of source / source_def, and the derived-value slot decorator is deprecated in favour of the guarded computed (slot_def remains as the storage-sense factory). Python has no compile-time read/write split (see the design's §4): the split is a convention — a Source has set / merge, a Computed does not — not a runtime gate.

There is no dedicated Context class — a plain dict is the context, so the Rust reference's ctx.computed(f) is spelled computed(ctx, f) here. Slot is retained as the storage position that holds a node: a Slot uses itself as the dictionary key that caches its value, so any dict works as the reactive "world" (lazily-spec §5.0 "Slot-as-storage"). It is the Python analog of lazily-rs's surviving storage-sense Slot; construct it directly with Slot(callable=…) when a raw storage node is genuinely needed.

Feature coverage

The full lazily capability set across every binding. Legend: ✅ shipped · ~ partial · absent or not applicable. The canonical matrix with per-cell notes and platform carve-outs lives in lazily-spec § Cross-Language Coverage.

Feature Rust Python Kotlin JS Dart Zig Go C++ C#
Reactive graph — two cell kinds (nodes SourceCell / ComputedCell; handles Source<T, M> / Computed<T>) + Effect sink + eager Computed (computed().eager()) / all cells guarded / batch
Keyed-map materialization (ComputedMap) — mint-on-access derived slots: transparency + deferral (#lzmatmode)
Thread-safe keyed map (ThreadSafeComputedMap) — Send + Sync + materialization confluence (#lzmatmode)
Async keyed map (AsyncComputedMap) — eventual transparency (#lzmatmode)
Keyed-map sync — membership propagation + materialize-on-ingest + derived-aggregate transparency (#lzfamilysync)
Thread-safe context (lock-backed)
Async reactive context
Flat state machine
Harel state charts
Keyed reactive maps (ReactiveMap: SourceMap / ComputedMap) + CellTree + reconcile
Memoized semantic tree (SemTree)
Stable-id alignment (manufactured identity)
Reactive queue (QueueCell SPSC/MPSC + QueueStorage adapter)
Broadcast topic (TopicCell) — independent cursors + durable replay + safe GC (#lztopiccell)
Competing-consumer work queue (WorkQueueCell) — exclusive leases + ack/nack + redelivery + DLQ (#lzworkqueue)
Merge algebra + Source<T, M> — associative MergePolicy (KeepLatest/Sum/Max/SetUnion/RawFifo), Cell ≡ Source<KeepLatest>, read-any-cell/write-Source split (#relaycell)
RelayCell — conflating relay + BackpressurePolicy + SpillStore + Transport + Inbox/Outbox + Rate/Window/Expiry/Priority/keyed policies (#relaycell)
Free-text character CRDT (TextCrdt)
TextCrdt delta sync (version_vector / delta_since / apply_delta)
CrdtTree lossless document contract (#lzcrdttree)
Move-aware sequence CRDT (SeqCrdt)
Lossless tree CRDT core (LosslessTreeCrdt, M1)
Lossless tree — dotted-frontier anti-entropy
Lossless tree — concurrent merge convergence
Registers (LWW / MV) + PnCounter + CellCrdt
IPC wire — Snapshot + Delta + CrdtSync
Shared-memory blob path (ShmBlobArena)
Cross-process zero-copy transport (BlobBackend / shm / arrow)
Distributed CRDT plane (CrdtPlaneRuntime / anti-entropy)
Reliable sync — resync coordinator + at-least-once durable outbox + OR-set/LWW liveness (#lzsync)
Storage-independent durable outbox (OutboxStore + shared outbox protocol; SQLite/Room/IndexedDB/file adapters)
Reliable-sync transport seam + full-duplex SyncDriver loop (IpcSink/IpcSource, #sync-driver)
Distributed plane — WebRTC transport + signaling
State projection / mirror
Causal receipts (CausalReceipts outcome projection)
Message-passing + RPC command plane (command-plane-v1)
C-ABI FFI boundary
Permission boundary (PeerPermissions / RemoteOp)
Capability negotiation (SessionHandshake)
Instrumentation / benchmarks
Temporal sources — TimerCell / IntervalCell / CronCell / DeadlineCell over a logical clock (#lztime)
Rate-shaping operators — DebounceCell / ThrottleCell / SampleCell / ProbabilisticSampleCell (#lzrateshape)
Membership + failure detection — MembershipCell (SWIM + Phi-accrual) / PeerSet / PeerChangeEvent (#lzmemb)
Distributed coordination — LeaseCell / LeaderCell / LockCell / SemaphoreCell / BarrierCell+QuorumCell (#lzcoord)
Presence + ephemeral plane — PresenceCell / AwarenessCell / EphemeralCell + Ephemeral/Durable markers (#lzpresence)
Stream windowing — TumblingWindow / SlidingWindow / SessionWindow over the merge algebra (#lzwindow)
Fault tolerance — CircuitBreakerCell / RetryPolicyCell / BulkheadCell / TimeoutCell (#lzresilience)
Embedded-service plane — HealthCell / ReadinessCell / DiscoveryCell / ServiceRegistry (#lzservice)

Installation

pip install lazily

Example usage

from lazily import CellSlot, cell, slot

# Cells hold a value that can be updated.
name = CellSlot[dict, dict, str]()


# Slots are functions that depend on cells and other slots.
@slot
def greeting(ctx: dict) -> str:
    print("Calculating greeting...")
    return f"Hello, {name(ctx).value}!"


# A CellSlot can also have a default value.
@cell
def response(ctx: dict) -> str:
    return "How are you?"


@slot
def greeting_and_response(ctx: dict) -> str:
    print("Calculating greeting_and_response...")
    return f"{greeting(ctx)} {response(ctx).value}"


ctx = {}

name(ctx).value = "World"

# First access: runs the function
print(greeting(ctx))
# Calculating greeting...
# 'Hello, World!'

# Second access: uses cache (no print)
print(greeting(ctx))
# 'Hello, World!'

# Dependencies also access cached values
print(greeting_and_response(ctx))
# Calculating greeting_and_response...
# 'Hello, World! How are you?'

# Dependencies also cached
print(greeting_and_response(ctx))
# 'Hello, World! How are you?'

# Update cell: invalidates cache
name(ctx).value = "Lazily"

# Access again: re-runs the function
print(greeting_and_response(ctx))
# Calculating greeting_and_response...
# Calculating greeting...
# 'Hello, Lazily! How are you?'

# Another access: uses cache
print(greeting_and_response(ctx))
# 'Hello, Lazily! How are you?'

Core Concepts

Context

A plain dict is the context. It owns all cached Slot values; Slots store their cache under themselves as keys. The current implementation is single-threaded — create one dict per reactive graph.

Slot

A Slot wraps a compute function (ctx) -> T; the result is cached after first access. Dependencies are discovered automatically via a global slot_stack — any Slot or Cell read during computation becomes a dependency and re-subscribes on every recompute, so conditional branches update the dependency graph with no manual cleanup. When a dependency invalidates, the Slot only marks its cache dirty; it does not recompute until called again.

Type Purpose
BaseSlot[C_in, C_ctx, T] Base slot without subscriber support
Slot[C_in, C_ctx, T] Storage-sense slot with dependency tracking and invalidation
slot Deprecated — use computed (guarded) or Slot(callable=…) (storage)
slot_def(resolve_ctx) Storage-sense decorator factory for a custom context resolver

Source cell

A Source cell (native class Cell) holds a mutable value. Reading cell.value inside a Computed or Effect auto-subscribes that reader; assigning cell.value = x (or cell.set(x)) compares old and new via != and, only if changed, cascades invalidation to dependents. Construct with source (the v1 cell name is deprecated).

Type Purpose
Cell[T] / Source[T] Mutable source value with subscription support
CellSlot[C_in, C_ctx, T] Slot that returns a Source cell
source Decorator: CellSlot with an identity resolver (canonical)
source_def(resolve_ctx) Decorator factory for a custom context resolver
cell / cell_def Deprecated v1 aliases of source / source_def

Eager Computed

An eager Computedcomputed(ctx, f).eager() — is the counterpart to a lazy Computed. Where a lazy cell marks itself dirty on invalidation and recomputes on the next read, an eager one recomputes the instant a dependency is invalidated, before the mutating call returns. The value is always materialized, so observers never see an intermediate unset value.

from lazily import CellSlot, computed

n = CellSlot[dict, dict, int]()

ctx: dict = {}
n(ctx).value = 1

doubled = computed(ctx, lambda c: n(c).value * 2).eager()  # eager: materialized now
print(doubled.value)   # 2

n(ctx).value = 5       # doubled recomputes immediately
print(doubled.value)   # 10 — already current, no lazy read needed

An eager Computed is composed from existing primitives, not a parallel engine: a memoized backing Slot supplies glitch-free, guarded recomputation, and a small puller Effect re-materializes it after every invalidation to supply the eagerness. It inherits the guard (an equal recompute suppresses the downstream cascade). .lazy() (or .dispose()) removes the eager puller — the value stays readable but reverts to lazy (recompute-on-read) behavior.

Method Purpose
computed(ctx, f) Lazy, guarded derived value bound to a context
computed(ctx, f).eager() The eager form (idempotent; returns the same handle)
.lazy() / .is_eager() Revert to lazy / query eagerness
computed_def(resolve_ctx) Decorator factory for a context-cached lazy Computed

StateMachine

StateMachine[S, E] is a finite state machine backed by a reactive Cell, so its state participates in dependency tracking like any other reactive value. Construct it with StateMachine(ctx, initial, transition) where transition is a pure (state, event) -> next_state | None (returning None rejects the event). send(event) returns whether the transition was accepted; a self-transition to an equal state is accepted but suppressed by the Cell's PartialEq guard.

Reactive collections, async, and thread-safe contexts

lazily-py also implements the lazily-spec compute-layer MUSTs, each ported from its Lean formal model in lazily-formal:

  • ReactiveMap / SourceMap / ComputedMap / CellTree — keyed reactive collections (#reactivemap) with independent value/membership/order signals and atomic move. One generic ReactiveMap over a handle kind; SourceMap (input cells, adds set + eager entry) and ComputedMap (derived slots, lazy get_or_insert_with + eager materialize_all) are its specializations.
  • QueueCell — a reactive FIFO queue (SPSC primitive with an MPSC-via-batch usage rule) with a pluggable QueueStorage backend. Reader-kind invalidation (head/len/is_empty/is_full/closed), bounded reactive backpressure via is_full, and the closure lifecycle (drain / Closed-distinct-from-Empty / idempotent).
  • reconcile_ops — move-minimized keyed reconciliation (LIS kernel).
  • AsyncSlot / AsyncEffect — the async slot lifecycle with stale-completion discard, and cleanup-before-body effect scheduling.
  • ThreadSafeContext — a lock-serialized batch boundary that coalesces writes into one invalidation pass.
  • lazily.ffi — the C-ABI FFI boundary (LazilyFfiStatus, LazilyFfiMessageKind incl. CrdtSync = 3, LazilyFfiBytes).

The test suite gates on lazily-formal's lake build (every theorem checks) and mirrors the named Lean theorems as property tests. See SPEC.md for the full compliance surface.

Reactive queue — lazily.queue

QueueCell is a FIFO collection composed of reactive cells — not a new cell kind — that adds queue semantics (push to tail, pop from head) to the reactive graph. It is an SPSC primitive; MPSC is a usage rule on the same primitive — multiple producers push inside one batch, which serializes the pushes into a deterministic order. The reactive shell wraps a pluggable QueueStorage backend (default VecDequeStorage); the shell owns the reader-kind version cells and invalidates by reader kind — a push to a non-empty queue does NOT invalidate the head reader, a pop does.

from lazily import QueueCell, QueuePopError, batch

ctx = {}
q: QueueCell[str] = QueueCell(ctx)

q.try_push("a")
q.try_push("b")
assert q.head() == "a"
assert q.len() == 2
assert q.try_pop() == "a"

# Bounded queue → reactive backpressure via is_full.
bq = QueueCell[int].with_capacity(ctx, 2)
bq.try_push(1)
bq.try_push(2)
assert bq.is_full()
assert bq.try_push(3).label == "Full"   # reject at capacity
assert bq.try_pop() == 1
assert not bq.is_full()                  # pop freed a slot → is_full reader invalidated

# MPSC: multiple producers push inside one batch → one invalidation pass.
batch(lambda: (q.try_push("p1"), q.try_push("p2")))

# Closure: pop on closed+empty returns Closed (distinct from Empty).
q.close()
assert q.is_closed()
assert q.try_push("x").label == "Closed"

Competing-consumer work queue

WorkQueueCell provides exclusive FIFO claims with visibility deadlines, worker-scoped acknowledgements, tail retries, and bounded dead-letter handling. Item ids survive retries while each claim gets a fresh delivery id.

from lazily import WorkQueueCell

work = WorkQueueCell[str](ctx, visibility_timeout=10, max_deliveries=3)
work.push("job")
delivery = work.claim("worker-a", 100)
assert delivery is not None
assert work.ack("worker-a", delivery.delivery_id)

The reader-kind independence law (a push to a non-empty queue does not change head, so the head reader is not invalidated) comes for free from the Cell != (PartialEq) guard: after each op the shell re-derives each reader-kind cell from storage and writes it back, and a cell whose value did not change is not invalidated.

IPC — the lazily-spec wire protocol

lazily.ipc implements the language-agnostic lazily-spec wire protocol, so a Python graph's state can be mirrored to remote observers across processes and languages. The JSON encoding is byte-compatible with the Rust (lazily-rs), Zig (lazily-zig), and TypeScript (@lazily/signaling) bindings, and is validated against the canonical lazily-spec/conformance fixtures (vendored under tests/conformance/).

Two message kinds flow over any transport (WebSocket text, WebRTC data, FFI buffer):

  • Snapshot — the full graph state at an epoch (nodes, edges, roots).
  • Delta — an ordered batch of the 7 DeltaOp variants (CellSet, SlotValue, Invalidate, NodeAdd, NodeRemove, EdgeAdd, EdgeRemove) applied with epoch sequencing and fail-closed resync.
from lazily import (
    Snapshot, NodeSnapshot, EdgeSnapshot, ShmBlobRef,
    Delta, DeltaOp, IpcMessage,
)

# Build and serialize a snapshot — encode_json() returns transport-agnostic bytes.
snap = Snapshot(
    epoch=7,
    nodes=[
        NodeSnapshot.payload(1, "i32", bytes([1, 2, 3])),
        NodeSnapshot.opaque(2, "opaque-type"),
        NodeSnapshot.shared_blob(3, "text/plain", ShmBlobRef(0, 16, 1, 7, 999)),
    ],
    edges=[EdgeSnapshot(2, 1), EdgeSnapshot(3, 1)],
    roots=[1, 2],
)
wire = IpcMessage.of_snapshot(snap).encode_json()
assert IpcMessage.decode_json(wire).snapshot == snap

# An incremental delta carrying mutations.
delta = Delta.next(40, [
    DeltaOp.cell_set(1, bytes([10])),
    DeltaOp.invalidate(3),
])
IpcMessage.of_delta(delta).encode_json()

A PeerPermissions boundary gates what is shared: it is default-deny, so only nodes a peer is explicitly allowed to read are serialized into a snapshot or delta — non-allowlisted nodes are omitted entirely.

Shared-memory blobs — ShmBlobArena

ShmBlobArena lets a Python process host blob payloads (not just carry ShmBlobRef descriptors). It is a bytearray-backed, append-only arena with a 40-byte header (LZSH magic + FNV-1a-64 checksum) and wraparound, ported from the lazily-rs ShmBlobArena<B> and byte-compatible with the Rust and Zig arenas. The module exports ShmBlobArena, ShmBlobArenaError (with its variant subclasses), and SHM_BLOB_HEADER_LEN.

Lossless tree CRDT — lazily.lossless_tree_crdt

LosslessTreeCrdt (#lzlosstree) is a single rooted concrete-syntax tree whose leaves own every rendered byterender(tree) == source_text for valid, invalid, and unknown source alike. Where TextCrdt is a flat lossless floor, this is the structured tree that can itself be the wire authority. Element nodes own structure only; all text lives in leaf nodes tagged Token / Trivia / Raw / Error, so unknown/invalid spans round-trip exactly as Raw/Error leaves rather than being discarded.

from lazily import LeafKind, LosslessTreeCrdt, SeedElement, SeedLeaf
from lazily.lossless_tree_crdt import ROOT

tree = LosslessTreeCrdt(peer=1)
heading = tree.create_node(ROOT, None, SeedElement("heading"))
tree.create_node(heading, None, SeedLeaf(LeafKind.TOKEN, "# "))
title = tree.create_node(heading, None, SeedLeaf(LeafKind.RAW, "Título"))
assert tree.render() == "# Título"

# Op-based delta sync: fork, diverge, converge through a dotted frontier.
other = tree.fork(peer=2)
other.edit_leaf(title, 0, 0, "X")
tree.apply_update(other.diff(tree.frontier()))
assert tree.render() == other.render()

Leaf text embeds TextCrdt wholesale; child order is a fractional index (key_between); the clock is a Lamport TreeOpId. Anti-entropy is op-based over a dotted, non-contiguous version frontier (TreeVersionFrontier) — a dot set (contiguous prefix + sparse holes), never a per-peer max, so a missing interior op stays representable and re-requestable. Leaf-local wire offsets are UTF-8 bytes (byte_to_char). The wire codec (tree_update_to_wire / tree_update_from_wire) validates against lazily-spec's lossless-tree-delta.json, and all nine conformance/lossless-tree/ fixtures replay.

Command / RPC message plane — lazily.command

command-plane-v1 is an additive sibling to Snapshot / Delta / CrdtSync: four evented frames (CommandSubmit / CommandCancel / CommandEvents / CommandProjection) that carry command traffic, not cell state. lazily owns the envelope; the namespace owns the IpcValue payload, which lazily never decodes.

The single hard rule: terminal authority is the causal receipt. A command is terminal only when a terminal CausalReceipt for its command_id folds in (applied, or rejected — including the cancelled / superseded / timed_out reasons). observed / accepted / started events are progress only; a transport ACK is never terminal.

from lazily import (
    CommandPolicy, CommandRpcClient, CommandSubmit, DedupePolicy,
    applied_receipt,
)
from lazily.ipc import IpcValue

class Transport:
    def __init__(self):
        self.sent = []

    def send(self, message):
        self.sent.append(message)

client = CommandRpcClient(Transport())
cmd_id = client.submit(CommandSubmit(
    command_id="cmd-1", causation_id="cmd-1", source="plugin",
    target="controller", namespace="agent-doc", name="editor_route",
    authority_generation=1, idempotency_key="doc:run", deadline_ms=0,
    policy=CommandPolicy(DedupePolicy.SAME_IDEMPOTENCY_KEY, False, True),
    payload_type="agent-doc.editor_route.v1", payload_hash="sha256:…",
    payload=IpcValue.of(b"{…}"),
    required_features=["command-plane-v1"],
))
# `call` resolves ONLY on a terminal receipt — never an ACK or `accepted`.
client.ingest_receipt(applied_receipt("rcpt-1", cmd_id, "controller", 1))
assert client.poll_call(cmd_id).kind.value == "resolved"

CommandProjection is the pure reducer (generation guards, idempotency, cancel-before-terminal-only, terminal-conflict-fails-closed, reconnect equivalence); CommandRpcClient is the derived RPC facade. The wire codec validates against lazily-spec's message-passing.json, and all eight conformance/message-passing/ fixtures replay.

Benchmarks

Wall-clock benchmarks live in BENCHMARKS.md, covering both the in-library micro-suite (reactive core, keyed reconciliation, SourceMap, TextCrdt, CRDT plane) and a large spreadsheet-shaped scale suite that mirrors the lazily-rs / lazily-go scale groups (N input cells + N formula slots, formula[i] = input[i] + input[i-1]). The scale suite is measured up to a full 10,000,000-cell Google Sheets workbook (N = 5,000,000); a one-cell edit plus a 1,000-cell viewport read stays in the ~75 µs range regardless of sheet size, because the lazy pull model recomputes only the ~2 formulas that read the edited input.

make bench          # micro-suite
make bench-scale    # scale suite (default N = 1,000,000)

# or directly, with a custom size:
uv run python -m lazily.benchmarks
LAZILY_SCALE_N=5000000 uv run python -m lazily.scale_bench   # 10M-cell workbook

See BENCHMARKS.md for the full results, hardware, and honest notes on CPython's per-node overhead.

The lazily family

lazily-py is one binding in a cross-language reactive family that shares the lazily-spec wire protocol:

Binding Language Package
lazily-rs Rust lazily (crates.io)
lazily-py Python lazily (PyPI)
lazily-zig Zig GitHub
@lazily/signaling TypeScript / Cloudflare Worker npm
lazily-spec wire protocol + conformance fixtures
lazily-formal Lean 4 formal model (FSM kernel + Harel state chart)

See lazily-spec for the canonical Snapshot/Delta schemas, the IPC Lean proofs of the epoch/memo/batch invariants, and the conformance fixtures every IPC-capable binding validates against. The language-agnostic formal model — the flat FSM kernel and the full Harel state chart — lives in lazily-formal.

Development

This project uses uv. Run the local CI-equivalent suite — type-check (ty), lint (ruff), the runnable README example, and the test suite — with:

uv run poe precommit

SPEC.md is the authoritative specification for the Python primitives and the lazily-spec compliance notes.

Download files

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

Source Distribution

lazily-0.36.0.tar.gz (331.3 kB view details)

Uploaded Source

Built Distributions

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

lazily-0.36.0-cp314-cp314-win_amd64.whl (334.9 kB view details)

Uploaded CPython 3.14Windows x86-64

lazily-0.36.0-cp314-cp314-musllinux_1_2_x86_64.whl (520.6 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

lazily-0.36.0-cp314-cp314-musllinux_1_2_aarch64.whl (523.7 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

lazily-0.36.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (522.5 kB view details)

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

lazily-0.36.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (517.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

lazily-0.36.0-cp314-cp314-macosx_11_0_arm64.whl (372.1 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

lazily-0.36.0-cp314-cp314-macosx_10_15_x86_64.whl (379.2 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

lazily-0.36.0-cp313-cp313-win_amd64.whl (333.9 kB view details)

Uploaded CPython 3.13Windows x86-64

lazily-0.36.0-cp313-cp313-musllinux_1_2_x86_64.whl (519.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

lazily-0.36.0-cp313-cp313-musllinux_1_2_aarch64.whl (522.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

lazily-0.36.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (521.7 kB view details)

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

lazily-0.36.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (515.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

lazily-0.36.0-cp313-cp313-macosx_11_0_arm64.whl (372.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

lazily-0.36.0-cp313-cp313-macosx_10_13_x86_64.whl (380.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

lazily-0.36.0-cp312-cp312-win_amd64.whl (333.3 kB view details)

Uploaded CPython 3.12Windows x86-64

lazily-0.36.0-cp312-cp312-musllinux_1_2_x86_64.whl (522.8 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

lazily-0.36.0-cp312-cp312-musllinux_1_2_aarch64.whl (525.8 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

lazily-0.36.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (524.9 kB view details)

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

lazily-0.36.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (519.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

lazily-0.36.0-cp312-cp312-macosx_11_0_arm64.whl (373.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

lazily-0.36.0-cp312-cp312-macosx_10_13_x86_64.whl (381.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

Details for the file lazily-0.36.0.tar.gz.

File metadata

  • Download URL: lazily-0.36.0.tar.gz
  • Upload date:
  • Size: 331.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for lazily-0.36.0.tar.gz
Algorithm Hash digest
SHA256 4a1549a3efd01d1516722d3e99580a5c97d7be5c902f74c65230e768ba81c2b8
MD5 68874187f31d0e0d9383a8c2c330c32b
BLAKE2b-256 acf143ba1eed854a10a88daf1438acf5563649b3905938df9983cc593ed3a815

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: lazily-0.36.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 334.9 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for lazily-0.36.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 00b7b4f437102a43768092afd96dd43726555061e716edf08ed4f9e509b4e856
MD5 a63219eb90e99cb95250bde5f78c9795
BLAKE2b-256 0b0a0d4297db57e945254525b261a03d24bf0eff29e0955f47051b87843533b8

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 fedd43bd3afbd7d0eeae2ecacd99df1a605ede0ae1a4c7306ead59c7f4a51cad
MD5 21497029e4fba1b28659383178485e08
BLAKE2b-256 ca3b6e151751adcd558339efd81f5138c8509d225c7f922cd71826f9afdb1dca

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9c032bc6f4fdecab627aebd40933583b3d13a6f9f12cfab4c2e4459b4e434092
MD5 8eab465f755481f6ee4f0186a55823ac
BLAKE2b-256 70d5a0f2f04c3c3cb374d1402d86071575ff78b6a4c4f4d4efd6431ec5efd52a

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 48a25c6f47c7a7947485af97adca9a4c7f3c331202125b30fd7570450557a73d
MD5 b309a9a72d51f21630c5380fafe2de89
BLAKE2b-256 bc713d75613e66070d5dac41eca5f1d26f0a171c547971c8177e6101586d6f4f

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 188400abbd2f0c6b42ad9d19e72edab041ffeaf79dac14dd0a53c9a7777c1a1c
MD5 ba1bb41925d0e49895834c4fa122c5cf
BLAKE2b-256 d566d3c74b4083664af487ecba63f05cf266214a393c775472bab4699210b270

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c8836ef88718c9388dece81536d3e9016b480cd5e1365411b9501484e001fd41
MD5 c5470991bad5ed3d26614cf7523c9e00
BLAKE2b-256 2891e3ccb1d56a4a00e2cd0fda3564401714f32dafc8502e49c4434d670a2476

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 6c8a20b88d32a32f0d080ccf03f0a47f2e0cbabdc0b124574f8063363f050628
MD5 34facdd88eb92bf8492992343004c936
BLAKE2b-256 f1ca5fcc464d3e523e35241af209f174e37d7c8db3f76de34fd646a919f8d2c0

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: lazily-0.36.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 333.9 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for lazily-0.36.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0e3ef611bd69bedbc6bf349d3d29c6a0a337445ff7b6dc49af6166afcefeb012
MD5 93aa23e932c4422a5904595ecd0593b2
BLAKE2b-256 2097f0153e0d668df461b69f3b206a9bf3a4b50f7a895a4f5199bf43b33498a8

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 804c2c009be74e73afceb0a66e802a3fa6e2142aa3316944f1955b7f2db9d970
MD5 5ebb50675d0fc34165cec73aba7fe211
BLAKE2b-256 ef87e9afe5860c36b7efe0f018c49112e38b467f162cb04aa4b80af92c47ec76

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1b5360f58b21a5b93716263bbb8b132ed4d6c67563e90997f74df3018791a359
MD5 4a65b738cc5013a0c467ee783b2a9502
BLAKE2b-256 f51f7d175f5a0bbcfa802195d56b84065651db2e173198068605317864b3b11a

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c3240ed8605108159a35058e5e3860a2ae85ac66cb2ff6907b5e6743342de81c
MD5 c5eb566d964e3ff81eea3e08f98dbc4f
BLAKE2b-256 2d6b8d240569ca38a429b66622f251303e902eb4a376c65fd75642a218808d60

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 77cd963a21faa912431953edf2ea8aff202c0e3938a04028cc08c341db9f6ecc
MD5 88cbc3db4f268771586bc4b3e3fed6bd
BLAKE2b-256 419dec83fca907064ae1984d7b1528d6c90fedd73dd9373c3cf0d878e6649293

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3feeb995d60896357ba7910f6c37784326493808a44a36860aa454a45ead6be6
MD5 52c6722b8733b524436699414fd6a59c
BLAKE2b-256 631d6c90cec996892f714ffdd94227a7a7aabded583fee69a58a93da21ff1322

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 c2516e8cd2b2d0f223524f7cb8cd460df68eb5d0015f0f0ce49f2e7bf30aa01e
MD5 2f51e496d9fe22a1577446999b158814
BLAKE2b-256 51e6df951570bc15c5b7d28966014185580497497f7c2222f1770b618f8498b6

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: lazily-0.36.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 333.3 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for lazily-0.36.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cde07c58ca4ec952f1837966db6ccd9e30dec3ca97aefe08fb99d8099dca8041
MD5 7ab361e857ed556b3ed09c370babf8b3
BLAKE2b-256 f33e5d2ba43bb74230aac70caa4acff2530314c20b888c129b17788cad1de63d

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8817195902cb58dcc4ec92a5a3adb17a3223ada220c938656601e4a762ca352a
MD5 8ed04578c2cfc3f77f7fbf8fbc460b9c
BLAKE2b-256 aacf94542ede68accbfb8e97fb4f3fa396e15e3f46e06a017b9ffa05d40def6c

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 3de12558c806c4522c2e6284e5a3b16badd45695c649e7621b37109d4090de8f
MD5 cb08874a40653865f4750b6fa956cfa8
BLAKE2b-256 2327747289b2e7f5c4efcfe208479405562aa1aeeb0410a28d069ae8b55962ee

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 51924411cd31c29fd1b7e2efd1921c430ff1a3aa5f0ee58c60bde32ebadb015c
MD5 54dc61578cfcd226c3caff898e0827b9
BLAKE2b-256 0b6e80b4867e51b0acbc7f2f44ff1ec2c9af65709652b1d88f8d31e8fda9a997

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f29d3e631bfa51dfb1dfb61231b6a942d71bb9acad3b4ab6b013a6bba150b65d
MD5 fc2d6d396d458aee1ae239191c6df156
BLAKE2b-256 0542fadc44b7ff5f2dab5fd984f7fcaada80989f76f846b675294dd0d23e79bf

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ffe581fe958a932a9765797dade7b2a54bdf41db659fd42e2d0a0f1c4a358681
MD5 047fc2ec0df01630d333f0bc7038759c
BLAKE2b-256 dc2c21a4bc85fee7f45588f125b65687ff26929028ddebb80b5d3fcb24f15375

See more details on using hashes here.

File details

Details for the file lazily-0.36.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.36.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eff4be99d0d550fef7fdebdf0d4b8f89be66fc6a216ba0bf75d96222aefe3e9c
MD5 b4dba3a6269fd9aa78f62c0493b79fd3
BLAKE2b-256 74645cb2af5cbe8f64d4fa55122661be14dfa0b8cb27a98f4893d27bc9358dae

See more details on using hashes here.

Release history Release notifications | RSS feed

0.40.0

22 files

0.39.0

22 files

0.38.0

22 files

0.37.1

22 files

0.37.0

22 files

This release

0.36.0 This release

22 files

0.35.0

22 files

0.34.0

22 files

0.33.0

22 files

0.32.0

22 files

0.31.2

22 files

0.31.1

22 files

0.31.0

8 files

0.30.1

2 files

0.30.0

2 files

0.29.0

2 files

0.27.0

2 files

0.26.0

2 files

0.25.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.0

2 files

0.21.0

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.1

2 files

0.11.0

2 files

0.10.2

2 files

0.10.1

2 files

0.10.0

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

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