{-# LANGUAGE QualifiedDo #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wno-missing-export-lists #-}

module Language.Haskell.TH.Natural.Syntax.Expr.Typed.Monad where

import qualified Language.Haskell.TH.Natural.Syntax.Builder.Monad as B
import Language.Haskell.TH.Natural.Syntax.Expr.Typed.Builder
import Prelude hiding (fail, (>>), (>>=))

{-# INLINE (>>=) #-}
(>>=) ::
    TypedExprBuilder s args0 args0' res0 a ->
    (a -> TypedExprBuilder s '[] args1' res1 b) ->
    TypedExprBuilder s args0 (args0' :++: args1') res1 b
>>= :: forall {k} {k} s (args0 :: [*]) (args0' :: [*]) (res0 :: k) a
       (args1' :: [*]) (res1 :: k) b.
TypedExprBuilder s args0 args0' res0 a
-> (a -> TypedExprBuilder s '[] args1' res1 b)
-> TypedExprBuilder s args0 (args0' :++: args1') res1 b
(>>=) (MkTEB ConstBuilder s a
f1) a -> TypedExprBuilder s '[] args1' res1 b
f2 = ConstBuilder s b
-> TypedExprBuilder s args0 (args0' :++: args1') res1 b
forall k s (prevArgs :: [*]) (args :: [*]) (res :: k) a.
ConstBuilder s a -> TypedExprBuilder s prevArgs args res a
MkTEB (ConstBuilder s b
 -> TypedExprBuilder s args0 (args0' :++: args1') res1 b)
-> ConstBuilder s b
-> TypedExprBuilder s args0 (args0' :++: args1') res1 b
forall a b. (a -> b) -> a -> b
$ B.do
    a <- ConstBuilder s a
f1
    unTEB (f2 a)

{-# INLINE (>>) #-}
(>>) ::
    TypedExprBuilder s args0 args0' res0 a ->
    TypedExprBuilder s '[] args1' res1 b ->
    TypedExprBuilder s args0 (args0' :++: args1') res1 b
>> :: forall {k} {k} s (args0 :: [*]) (args0' :: [*]) (res0 :: k) a
       (args1' :: [*]) (res1 :: k) b.
TypedExprBuilder s args0 args0' res0 a
-> TypedExprBuilder s '[] args1' res1 b
-> TypedExprBuilder s args0 (args0' :++: args1') res1 b
(>>) (MkTEB ConstBuilder s a
f1) (MkTEB ConstBuilder s b
f2) = ConstBuilder s b
-> TypedExprBuilder s args0 (args0' :++: args1') res1 b
forall k s (prevArgs :: [*]) (args :: [*]) (res :: k) a.
ConstBuilder s a -> TypedExprBuilder s prevArgs args res a
MkTEB (ConstBuilder s b
 -> TypedExprBuilder s args0 (args0' :++: args1') res1 b)
-> ConstBuilder s b
-> TypedExprBuilder s args0 (args0' :++: args1') res1 b
forall a b. (a -> b) -> a -> b
$ ConstBuilder s a
f1 ConstBuilder s a -> ConstBuilder s b -> ConstBuilder s b
forall {k} (m :: * -> *) s (prev :: k) (curr :: k) a (next :: k) b.
Monad m =>
BaseBuilder m s prev curr a
-> BaseBuilder m s curr next b -> BaseBuilder m s prev next b
B.>> ConstBuilder s b
f2

fail :: String -> TypedExprBuilder s args args res a
fail :: forall {k} s (args :: [*]) (res :: k) a.
String -> TypedExprBuilder s args args res a
fail = ConstBuilder s a -> TypedExprBuilder s args args res a
forall k s (prevArgs :: [*]) (args :: [*]) (res :: k) a.
ConstBuilder s a -> TypedExprBuilder s prevArgs args res a
MkTEB (ConstBuilder s a -> TypedExprBuilder s args args res a)
-> (String -> ConstBuilder s a)
-> String
-> TypedExprBuilder s args args res a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ConstBuilder s a
forall {k} (m :: * -> *) s (prev :: k) (curr :: k) a.
MonadFail m =>
String -> BaseBuilder m s prev curr a
B.fail