Write asynchronous F# workflows whose expected failures and required dependencies are visible in their types.
Warning
Axial is pre-1.0 and its API may change before the first stable release.
A handler usually needs services and can fail, but a Task signature shows neither fact. Flow<'env, 'error, 'value>
makes both part of the contract.
open Axial
type CheckoutError =
| OrderNotFound of orderId: int
| PaymentDeclined of reason: string
type Receipt = { OrderId: int; Total: decimal; Reference: string }
type CheckoutEnv =
{ FindTotal: int -> ColdTask<Result<decimal, CheckoutError>>
Charge: decimal -> ColdTask<Result<string, CheckoutError>> }
let checkout orderId : Flow<CheckoutEnv, CheckoutError, Receipt> =
flow {
let! findTotal = Flow.envWith _.FindTotal
let! charge = Flow.envWith _.Charge
let! total = findTotal orderId
let! reference = charge total
return { OrderId = orderId; Total = total; Reference = reference }
}The application supplies live functions. A test supplies a record of fakes. The workflow does not change.
Adding a timeout, a retry policy, and a resource that must be released does not change the signature either, because the runtime that starts the workflow owns cancellation, retries, and cleanup:
open System
let checkoutOrder orderId : Flow<CheckoutEnv, CheckoutError, Receipt> =
checkout orderId
|> Flow.Runtime.retry (RetryPolicy.noDelay 3)
|> Flow.Runtime.timeout (TimeSpan.FromSeconds 5.0) (PaymentDeclined "checkout timed out")Flow also carries concurrency, scheduling, streams, and structured child fibers through the same runtime.
dotnet add package Axial-
Axial— the core workflow model: typed failures, dependencies, concurrency, resources, schedules, streams, and layers. -
Axial.Process— external process composition, pipelines, streaming output, typed failures, cancellation, and cleanup. -
Axial.HttpClient— typed HTTP requests, response handling, and reliability policies.
Supporting packages provide platform services, console and file-system access, hosting, and telemetry. The package catalogue links the first-class libraries and the complete compatibility matrix.
- Getting started
- Add Axial to an existing Task application
- Failures and defects
- Dependencies and services
- Concurrency
- Process
- HTTP client
- Runnable examples
- Integration reference application
Reified declares value, model, JSON, and HTTP contracts. Axial's optional server adapters execute Reified HTTP contracts as workflows; neither core depends on the other.
Declare a contract with Reified. Serve it with Axial.