{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}

module Hercules.CNix.Expr.Context
  ( module Hercules.CNix.Expr.Context,
    module Hercules.CNix.Store.Context,
  )
where

import qualified Data.Map as M
import Hercules.CNix.Store.Context hiding (context)
import qualified Language.C.Inline.Context as C
import qualified Language.C.Inline.Cpp as C
import qualified Language.C.Types as C
import Protolude

data EvalState

data Value'

data Attr'

data BindingsBuilder'

context :: C.Context
context :: Context
context =
  Context
C.cppCtx Context -> Context -> Context
forall a. Semigroup a => a -> a -> a
<> Context
C.fptrCtx
    Context -> Context -> Context
forall a. Semigroup a => a -> a -> a
<> Context
C.bsCtx
    Context -> Context -> Context
forall a. Semigroup a => a -> a -> a
<> Context
evalContext

(=:) :: k -> a -> Map k a
=: :: forall k a. k -> a -> Map k a
(=:) = k -> a -> Map k a
forall k a. k -> a -> Map k a
M.singleton

evalContext :: C.Context
evalContext :: Context
evalContext =
  Context
forall a. Monoid a => a
mempty
    { ctxTypesTable :: Map TypeSpecifier (Q Type)
C.ctxTypesTable =
        CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"EvalState" TypeSpecifier -> Q Type -> Map TypeSpecifier (Q Type)
forall k a. k -> a -> Map k a
=: [t|EvalState|]
          Map TypeSpecifier (Q Type)
-> Map TypeSpecifier (Q Type) -> Map TypeSpecifier (Q Type)
forall a. Semigroup a => a -> a -> a
<> CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"Value" TypeSpecifier -> Q Type -> Map TypeSpecifier (Q Type)
forall k a. k -> a -> Map k a
=: [t|Value'|]
          Map TypeSpecifier (Q Type)
-> Map TypeSpecifier (Q Type) -> Map TypeSpecifier (Q Type)
forall a. Semigroup a => a -> a -> a
<> CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"Attr" TypeSpecifier -> Q Type -> Map TypeSpecifier (Q Type)
forall k a. k -> a -> Map k a
=: [t|Attr'|]
          Map TypeSpecifier (Q Type)
-> Map TypeSpecifier (Q Type) -> Map TypeSpecifier (Q Type)
forall a. Semigroup a => a -> a -> a
<> CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"BindingsBuilder" TypeSpecifier -> Q Type -> Map TypeSpecifier (Q Type)
forall k a. k -> a -> Map k a
=: [t|BindingsBuilder'|]
    }