{-# LANGUAGE TypeOperators #-}

module Language.Haskell.TH.Natural.Syntax.Expr.Simple.Typed (
    SimpleTypedExprDefinition,
    SimpleTypedExprBuilder,
    module Language.Haskell.TH.Natural.Syntax.Expr.Simple.State,
    newExpr,
    arg,
    module Language.Haskell.TH.Natural.Syntax.Expr.Typed.Monad,
    module Language.Haskell.TH.Natural.Syntax.Expr.Typed.Class,
) where

import Language.Haskell.TH.Natural.Syntax.Expr.Simple.State
import qualified Language.Haskell.TH.Natural.Syntax.Expr.Simple.Untyped as Untyped
import Language.Haskell.TH.Natural.Syntax.Expr.Typed.Builder
import Language.Haskell.TH.Natural.Syntax.Expr.Typed.Class
import Language.Haskell.TH.Natural.Syntax.Expr.Typed.Monad
import qualified Language.Haskell.TH.Syntax as TH

type SimpleTypedExprDefinition a = TH.Q (TH.TExp a)

type SimpleTypedExprBuilder = TypedExprBuilder SimpleExprBuilderState

newExpr :: SimpleTypedExprBuilder '[] args (Returns a) () -> SimpleTypedExprDefinition (args :~> Returns a)
newExpr :: forall (args :: [*]) a.
SimpleTypedExprBuilder '[] args (Returns a) ()
-> SimpleTypedExprDefinition (args :~> Returns a)
newExpr = TypedExprBuilder SimpleExprBuilderState '[] args (Returns a) ()
-> Q (TExp (args :~> Returns a))
forall (args :: [*]) a.
SimpleTypedExprBuilder '[] args (Returns a) ()
-> SimpleTypedExprDefinition (args :~> Returns a)
forall st (args :: [*]) a.
IsTypedExprBuilder st =>
TypedExprBuilder st '[] args (Returns a) ()
-> Q (TExp (args :~> Returns a))
runTypedExprBuilder

-- | Adds an argument to the underlying 'LamE'
arg :: SimpleTypedExprBuilder args (args :> a) Unknown (TH.TExp a)
arg :: forall {a} (args :: [*]) a.
SimpleTypedExprBuilder args (args :> a) 'Unknown (TExp a)
arg = Builder SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) (TExp a)
-> TypedExprBuilder
     SimpleExprBuilderState args (args :> a) 'Unknown (TExp a)
forall {k1} {k2} s (step :: k1) (step1 :: k1) a (args0 :: [*])
       (args :: [*]) (res :: k2).
Builder s step step1 a -> TypedExprBuilder s args0 args res a
unsafeUntyped (Builder SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) (TExp a)
 -> TypedExprBuilder
      SimpleExprBuilderState args (args :> a) 'Unknown (TExp a))
-> Builder SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) (TExp a)
-> TypedExprBuilder
     SimpleExprBuilderState args (args :> a) 'Unknown (TExp a)
forall a b. (a -> b) -> a -> b
$ (Exp -> TExp a)
-> BaseBuilder Q SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) Exp
-> Builder SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) (TExp a)
forall a b.
(a -> b)
-> BaseBuilder Q SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) a
-> BaseBuilder Q SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Exp -> TExp a
forall a. Exp -> TExp a
TH.TExp BaseBuilder Q SimpleExprBuilderState (ZonkAny 1) (ZonkAny 1) Exp
forall {k} (curr :: k). SimpleExprBuilder curr curr Exp
Untyped.arg