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

Source #data JobTree payload

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

Smart constructors

Source #leaf :: JobWrite payload -> JobTree payload

A single job with no children.

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

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

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

Infix rollup for leaf-only children.

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

Interpreter

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

Arguments

:: forall m payload. (JobPayload payload, MonadArbiter m) 
=> Text

PostgreSQL schema name

-> Text

Table name

-> JobTree payload 
-> m (Either Text (NonEmpty (JobRead payload))) 

Insert a JobTree in one transaction, returning every inserted job root-first. Left on any failure, such as a dedup conflict, with nothing committed.