Skip to main content

Emergent parallelism and execution branching from inside your functions

Project description

bifurcate

Emergent parallelism and execution branching from inside your functions.

Standard patterns force you to extract your logic and wrap it in for loops or complex task graphs just to run variations of a pipeline. bifurcate lets you branch the execution graph dynamically from inside the function itself.

Write your logic sequentially, as if it only runs once. Let the system magically map the permutations.

Usage

import bifurcate

@bifurcate.collect
def calculate_pricing(user_id):
    base_price = database.get_price(user_id)

    # BRANCH POINT:
    # The system transparently forks the execution universe here.
    discount = bifurcate.branch([0.0, 0.10, 0.20])

    final_price = base_price * (1 - discount)

    # You own the traceability. Return a dict to map paths to results.
    return {"discount": discount, "price": final_price}

# The decorator automatically aggregates the permutations
results = calculate_pricing("user_123")
# Output:[{'discount': 0.0, 'price': 100}, {'discount': 0.1, 'price': 90}, ...]

Features

  • In-line Branching: No more for loops polluting your caller logic. Keep your domain functions completely isolated and focused on single-item math.
  • Zero-Boilerplate Permutations: Perfect for A/B testing, ML hyperparameter sweeps, or fallback strategies.
  • The List Monad for Python: Achieves mathematically pure map/flatMap operations using standard, highly-readable imperative Python syntax.

Core Mechanics

  • Bytecode Identity: The system doesn't track sequence order. It uses Python's bytecode instruction pointer (f_lasti) to identify branches. This means you can safely place branch() inside unpredictable if statements or unordered set() iterations. The execution topology can be completely dynamic.
  • Primitive Composition: Because bifurcate simply re-evaluates the function using native mechanics, it composes flawlessly with pure caching tools. Heavy setup steps before the fork can be memoized seamlessly without DAG configuration.

Installation

uv add bifurcate
# or
pip install bifurcate

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

bifurcate-2.0.0.tar.gz (2.7 kB view details)

Uploaded Source

Built Distribution

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

bifurcate-2.0.0-py3-none-any.whl (3.6 kB view details)

Uploaded Python 3

File details

Details for the file bifurcate-2.0.0.tar.gz.

File metadata

  • Download URL: bifurcate-2.0.0.tar.gz
  • Upload date:
  • Size: 2.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for bifurcate-2.0.0.tar.gz
Algorithm Hash digest
SHA256 3b5183b759b8d1a1ca6ef7890e6b08bd9aa47ce40af1e859a181a54130807f1a
MD5 ae2d4589fa9cdd2249d177a6520c6388
BLAKE2b-256 f91d5f278228f75be3eb66d0c51ea91855347ebdbeabe754a31ea28c1d2742ec

See more details on using hashes here.

File details

Details for the file bifurcate-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: bifurcate-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 3.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for bifurcate-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 feca4edcf8efad79a6e9eb04f6ee969b096c4d9ba8d017de8b4e06687c23fde2
MD5 40ef655bf212502cd2cbb14f7cbf9a6f
BLAKE2b-256 1cf8f5962015c6d5db0fb1174844b3142de4f1d93fb31c334fec4f0c0ed2cf2b

See more details on using hashes here.

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