packages feed

hydra-0.14.0: src/main/haskell/Hydra/Dsl/Meta/Context.hs

-- | Haskell-specific convenience layer over the generated Hydra.Dsl.Context module.

module Hydra.Dsl.Meta.Context (
  module Hydra.Dsl.Context,
  module Hydra.Dsl.Meta.Context,
  DslCtx.contextTrace,
  DslCtx.contextMessages,
  DslCtx.contextOther,
) where

import Hydra.Kernel
import Hydra.Dsl.Meta.Phantoms
import Hydra.Dsl.Context hiding (contextTrace, contextMessages, contextOther)
import qualified Hydra.Dsl.Context as DslCtx

import qualified Hydra.Dsl.Meta.Lib.Eithers as Eithers
import qualified Hydra.Dsl.Meta.Lib.Lists as Lists


-- | Wrap an Either's Left side with a Context
withContext :: TTerm Context -> TTerm (Either e a) -> TTerm (Either (InContext e) a)
withContext cx e = Eithers.bimap ("_wc_e" ~> inContext (var "_wc_e") cx) ("_wc_a" ~> var "_wc_a") e

-- | Push a trace frame onto a Context
pushTrace :: TTerm String -> TTerm Context -> TTerm Context
pushTrace label cx = context
    (Lists.cons label (DslCtx.contextTrace cx))
    (DslCtx.contextMessages cx)
    (DslCtx.contextOther cx)

-- | Create a Left (InContext error cx)
failInContext :: TTerm e -> TTerm Context -> TTerm (Either (InContext e) a)
failInContext err cx = left (inContext err cx)