packages feed

ki-0.1.0: src/Ki/Context.hs

module Ki.Context
  ( Context (..),
    dummyContext,
    globalContext,
  )
where

import Ki.CancelToken (CancelToken)
import Ki.Ctx (Ctx)
import qualified Ki.Ctx as Ctx
import Ki.Prelude

data Context = Context
  { cancelContext :: IO (),
    contextCancelTokenSTM :: STM CancelToken,
    -- | Derive a child context from a parent context.
    --
    --   * If the parent is already cancelled, so is the child.
    --   * If the parent isn't already canceled, the child registers itself with the
    --     parent such that:
    --       * When the parent is cancelled, so is the child
    --       * When the child is cancelled, it removes the parent's reference to it
    deriveContext :: STM Context
  }

newContext :: Ctx -> Context
newContext ctx =
  Context
    { cancelContext = Ctx.cancelCtx ctx,
      contextCancelTokenSTM = Ctx.ctxCancelToken ctx,
      deriveContext = newContext <$> Ctx.deriveCtx ctx
    }

dummyContext :: Context
dummyContext =
  Context
    { cancelContext = pure (),
      contextCancelTokenSTM = retry,
      deriveContext = pure dummyContext
    }

-- | The global context. It cannot be cancelled.
globalContext :: Context
globalContext =
  Context
    { cancelContext = pure (),
      contextCancelTokenSTM = retry,
      deriveContext = newContext <$> Ctx.newCtxSTM
    }