arbiter-core-0.1.0.0
arbiter-core
Safe HaskellNone
LanguageGHC2024

Arbiter.Core.JobTree

Description

Atomic parent-child job trees. Children run first. Their suspended finalizer becomes claimable when no children remain in the main queue. Child results are transient and are deleted when the finalizer is acked. Finalizers must persist any results that need to outlive the tree.

Synopsis

Tree type

data JobTree payloadSource #

A tree of jobs. Leaves are single jobs. Finalizers are parents with children that run immediately while the parent waits for completion.

Smart constructors

leaf :: JobWrite payload -> JobTree payloadSource #

A single job with no children.

rollup :: JobWrite payload -> NonEmpty (JobTree payload) -> JobTree payloadSource #

A finalizer running once no child of it is left in the main queue. Nested rollups do not merge on their own. An intermediate finalizer returns the merged value for results to travel upward.

rollup (defaultJob root)
  ( leaf (defaultJob leaf1)
  :| [leaf (defaultJob leaf2)]
  )

Operators

(<~~) :: JobWrite payload -> NonEmpty (JobWrite payload) -> JobTree payload infixr 6Source #

Infix rollup for leaf-only children.

defaultJob reducer <~~ (defaultJob mapper1 :| [defaultJob mapper2])

Interpreter

insertJobTree :: forall m payload. (JobPayload payload, MonadArbiter m) => SchemaName -> TableName -> JobTree payload -> m (Either Text (NonEmpty (JobRead payload)))Source #

Insert a JobTree in one transaction, returning every inserted job in pre-order. Left on a dedup conflict at any node, with nothing committed. Application code uses insertJobTree.