{-# LANGUAGE CPP #-}
{-# LANGUAGE UndecidableInstances #-}
#ifndef MIN_VERSION_GLASGOW_HASKELL
#define MIN_VERSION_GLASGOW_HASKELL(a,b,c,d) 0
#endif
  
#if MIN_VERSION_GLASGOW_HASKELL(7,10,0,0)
#else
{-# LANGUAGE OverlappingInstances #-}
#endif
module Language.Syntactic.Syntax
    ( 
      AST (..)
    , ASTF
    , ASTFull (..)
    , Full (..)
    , (:->) (..)
    , SigRep (..)
    , Signature (..)
    , DenResult
    , Symbol (..)
    , size
      
    , SmartFun
    , SmartSig
    , SmartSym
    , smartSym'
      
    , (:+:) (..)
    , Project (..)
    , (:<:) (..)
    , smartSym
    , smartSymTyped
    , Empty
      
    , E (..)
    , liftE
    , liftE2
    , EF (..)
    , liftEF
    , liftEF2
      
    , Typed (..)
    , injT
    , castExpr
      
    , NFData1 (..)
    , symType
    , prjP
    ) where
import Control.DeepSeq (NFData (..))
import Data.Typeable
#if MIN_VERSION_GLASGOW_HASKELL(7,10,0,0)
#else
import Data.Foldable (Foldable)
import Data.Proxy  
import Data.Traversable (Traversable)
#endif
data AST sym sig
  where
    Sym  :: sym sig -> AST sym sig
    (:$) :: AST sym (a :-> sig) -> AST sym (Full a) -> AST sym sig
infixl 1 :$
type ASTF sym a = AST sym (Full a)
newtype ASTFull sym a = ASTFull {ASTFull sym a -> ASTF sym a
unASTFull :: ASTF sym a}
instance Functor sym => Functor (AST sym)
  where
    fmap :: (a -> b) -> AST sym a -> AST sym b
fmap a -> b
f (Sym sym a
s)  = sym b -> AST sym b
forall (sym :: * -> *) sig. sym sig -> AST sym sig
Sym ((a -> b) -> sym a -> sym b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f sym a
s)
    fmap a -> b
f (AST sym (a :-> a)
s :$ AST sym (Full a)
a) = ((a :-> a) -> a :-> b) -> AST sym (a :-> a) -> AST sym (a :-> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> (a :-> a) -> a :-> b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) AST sym (a :-> a)
s AST sym (a :-> b) -> AST sym (Full a) -> AST sym b
forall (sym :: * -> *) a sig.
AST sym (a :-> sig) -> AST sym (Full a) -> AST sym sig
:$ AST sym (Full a)
a
newtype Full a = Full { Full a -> a
result :: a }
  deriving (Full a -> Full a -> Bool
(Full a -> Full a -> Bool)
-> (Full a -> Full a -> Bool) -> Eq (Full a)
forall a. Eq a => Full a -> Full a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Full a -> Full a -> Bool
$c/= :: forall a. Eq a => Full a -> Full a -> Bool
== :: Full a -> Full a -> Bool
$c== :: forall a. Eq a => Full a -> Full a -> Bool
Eq, Int -> Full a -> ShowS
[Full a] -> ShowS
Full a -> String
(Int -> Full a -> ShowS)
-> (Full a -> String) -> ([Full a] -> ShowS) -> Show (Full a)
forall a. Show a => Int -> Full a -> ShowS
forall a. Show a => [Full a] -> ShowS
forall a. Show a => Full a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Full a] -> ShowS
$cshowList :: forall a. Show a => [Full a] -> ShowS
show :: Full a -> String
$cshow :: forall a. Show a => Full a -> String
showsPrec :: Int -> Full a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Full a -> ShowS
Show, Typeable, a -> Full b -> Full a
(a -> b) -> Full a -> Full b
(forall a b. (a -> b) -> Full a -> Full b)
-> (forall a b. a -> Full b -> Full a) -> Functor Full
forall a b. a -> Full b -> Full a
forall a b. (a -> b) -> Full a -> Full b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Full b -> Full a
$c<$ :: forall a b. a -> Full b -> Full a
fmap :: (a -> b) -> Full a -> Full b
$cfmap :: forall a b. (a -> b) -> Full a -> Full b
Functor)
newtype a :-> sig = Partial (a -> sig)
  deriving (Typeable, a -> (a :-> b) -> a :-> a
(a -> b) -> (a :-> a) -> a :-> b
(forall a b. (a -> b) -> (a :-> a) -> a :-> b)
-> (forall a b. a -> (a :-> b) -> a :-> a) -> Functor ((:->) a)
forall a b. a -> (a :-> b) -> a :-> a
forall a b. (a -> b) -> (a :-> a) -> a :-> b
forall a a b. a -> (a :-> b) -> a :-> a
forall a a b. (a -> b) -> (a :-> a) -> a :-> b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> (a :-> b) -> a :-> a
$c<$ :: forall a a b. a -> (a :-> b) -> a :-> a
fmap :: (a -> b) -> (a :-> a) -> a :-> b
$cfmap :: forall a a b. (a -> b) -> (a :-> a) -> a :-> b
Functor)
infixr :->
data SigRep sig
  where
    SigFull :: SigRep (Full a)
    SigMore :: SigRep sig -> SigRep (a :-> sig)
class Signature sig
  where
    signature :: SigRep sig
instance Signature (Full a)
  where
    signature :: SigRep (Full a)
signature = SigRep (Full a)
forall a. SigRep (Full a)
SigFull
instance Signature sig => Signature (a :-> sig)
  where
    signature :: SigRep (a :-> sig)
signature = SigRep sig -> SigRep (a :-> sig)
forall sig a. SigRep sig -> SigRep (a :-> sig)
SigMore SigRep sig
forall sig. Signature sig => SigRep sig
signature
type family   DenResult sig
type instance DenResult (Full a)    = a
type instance DenResult (a :-> sig) = DenResult sig
class Symbol sym
  where
    
    symSig :: sym sig -> SigRep sig
instance NFData1 sym => NFData (AST sym sig)
  where
    rnf :: AST sym sig -> ()
rnf (Sym sym sig
s)  = sym sig -> ()
forall (c :: * -> *) a. NFData1 c => c a -> ()
rnf1 sym sig
s
    rnf (AST sym (a :-> sig)
s :$ AST sym (Full a)
a) = AST sym (a :-> sig) -> ()
forall a. NFData a => a -> ()
rnf AST sym (a :-> sig)
s () -> () -> ()
`seq` AST sym (Full a) -> ()
forall a. NFData a => a -> ()
rnf AST sym (Full a)
a
size :: AST sym sig -> Int
size :: AST sym sig -> Int
size (Sym sym sig
_)  = Int
1
size (AST sym (a :-> sig)
s :$ AST sym (Full a)
a) = AST sym (a :-> sig) -> Int
forall (sym :: * -> *) sig. AST sym sig -> Int
size AST sym (a :-> sig)
s Int -> Int -> Int
forall a. Num a => a -> a -> a
+ AST sym (Full a) -> Int
forall (sym :: * -> *) sig. AST sym sig -> Int
size AST sym (Full a)
a
type family   SmartFun (sym :: * -> *) sig
type instance SmartFun sym (Full a)    = ASTF sym a
type instance SmartFun sym (a :-> sig) = ASTF sym a -> SmartFun sym sig
type family   SmartSig f
type instance SmartSig (AST sym sig)     = sig
type instance SmartSig (ASTF sym a -> f) = a :-> SmartSig f
type family   SmartSym f :: * -> *
type instance SmartSym (AST sym sig) = sym
type instance SmartSym (a -> f)      = SmartSym f
smartSym' :: forall sig f sym
    .  ( Signature sig
       , f   ~ SmartFun sym sig
       , sig ~ SmartSig f
       , sym ~ SmartSym f
       )
    => sym sig -> f
smartSym' :: sym sig -> f
smartSym' sym sig
s = SigRep sig -> AST sym sig -> SmartFun sym sig
forall sig. SigRep sig -> AST sym sig -> SmartFun sym sig
go (SigRep sig
forall sig. Signature sig => SigRep sig
signature :: SigRep sig) (sym sig -> AST sym sig
forall (sym :: * -> *) sig. sym sig -> AST sym sig
Sym sym sig
s)
  where
    go :: forall sig . SigRep sig -> AST sym sig -> SmartFun sym sig
    go :: SigRep sig -> AST sym sig -> SmartFun sym sig
go SigRep sig
SigFull AST sym sig
s       = SmartFun sym sig
AST sym sig
s
    go (SigMore SigRep sig
sig) AST sym sig
s = \AST sym (Full a)
a -> SigRep sig -> AST sym sig -> SmartFun sym sig
forall sig. SigRep sig -> AST sym sig -> SmartFun sym sig
go SigRep sig
sig (AST sym sig
AST sym (a :-> sig)
s AST sym (a :-> sig) -> AST sym (Full a) -> AST sym sig
forall (sym :: * -> *) a sig.
AST sym (a :-> sig) -> AST sym (Full a) -> AST sym sig
:$ AST sym (Full a)
a)
data (sym1 :+: sym2) sig
  where
    InjL :: sym1 a -> (sym1 :+: sym2) a
    InjR :: sym2 a -> (sym1 :+: sym2) a
  deriving (a -> (:+:) sym1 sym2 b -> (:+:) sym1 sym2 a
(a -> b) -> (:+:) sym1 sym2 a -> (:+:) sym1 sym2 b
(forall a b. (a -> b) -> (:+:) sym1 sym2 a -> (:+:) sym1 sym2 b)
-> (forall a b. a -> (:+:) sym1 sym2 b -> (:+:) sym1 sym2 a)
-> Functor (sym1 :+: sym2)
forall a b. a -> (:+:) sym1 sym2 b -> (:+:) sym1 sym2 a
forall a b. (a -> b) -> (:+:) sym1 sym2 a -> (:+:) sym1 sym2 b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (sym1 :: * -> *) (sym2 :: * -> *) a b.
(Functor sym1, Functor sym2) =>
a -> (:+:) sym1 sym2 b -> (:+:) sym1 sym2 a
forall (sym1 :: * -> *) (sym2 :: * -> *) a b.
(Functor sym1, Functor sym2) =>
(a -> b) -> (:+:) sym1 sym2 a -> (:+:) sym1 sym2 b
<$ :: a -> (:+:) sym1 sym2 b -> (:+:) sym1 sym2 a
$c<$ :: forall (sym1 :: * -> *) (sym2 :: * -> *) a b.
(Functor sym1, Functor sym2) =>
a -> (:+:) sym1 sym2 b -> (:+:) sym1 sym2 a
fmap :: (a -> b) -> (:+:) sym1 sym2 a -> (:+:) sym1 sym2 b
$cfmap :: forall (sym1 :: * -> *) (sym2 :: * -> *) a b.
(Functor sym1, Functor sym2) =>
(a -> b) -> (:+:) sym1 sym2 a -> (:+:) sym1 sym2 b
Functor, (:+:) sym1 sym2 a -> Bool
(a -> m) -> (:+:) sym1 sym2 a -> m
(a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b
(forall m. Monoid m => (:+:) sym1 sym2 m -> m)
-> (forall m a. Monoid m => (a -> m) -> (:+:) sym1 sym2 a -> m)
-> (forall m a. Monoid m => (a -> m) -> (:+:) sym1 sym2 a -> m)
-> (forall a b. (a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b)
-> (forall a b. (a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b)
-> (forall b a. (b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b)
-> (forall b a. (b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b)
-> (forall a. (a -> a -> a) -> (:+:) sym1 sym2 a -> a)
-> (forall a. (a -> a -> a) -> (:+:) sym1 sym2 a -> a)
-> (forall a. (:+:) sym1 sym2 a -> [a])
-> (forall a. (:+:) sym1 sym2 a -> Bool)
-> (forall a. (:+:) sym1 sym2 a -> Int)
-> (forall a. Eq a => a -> (:+:) sym1 sym2 a -> Bool)
-> (forall a. Ord a => (:+:) sym1 sym2 a -> a)
-> (forall a. Ord a => (:+:) sym1 sym2 a -> a)
-> (forall a. Num a => (:+:) sym1 sym2 a -> a)
-> (forall a. Num a => (:+:) sym1 sym2 a -> a)
-> Foldable (sym1 :+: sym2)
forall a. Eq a => a -> (:+:) sym1 sym2 a -> Bool
forall a. Num a => (:+:) sym1 sym2 a -> a
forall a. Ord a => (:+:) sym1 sym2 a -> a
forall m. Monoid m => (:+:) sym1 sym2 m -> m
forall a. (:+:) sym1 sym2 a -> Bool
forall a. (:+:) sym1 sym2 a -> Int
forall a. (:+:) sym1 sym2 a -> [a]
forall a. (a -> a -> a) -> (:+:) sym1 sym2 a -> a
forall m a. Monoid m => (a -> m) -> (:+:) sym1 sym2 a -> m
forall b a. (b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b
forall a b. (a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Eq a) =>
a -> (:+:) sym1 sym2 a -> Bool
forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Num a) =>
(:+:) sym1 sym2 a -> a
forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Ord a) =>
(:+:) sym1 sym2 a -> a
forall (sym1 :: * -> *) (sym2 :: * -> *) m.
(Foldable sym1, Foldable sym2, Monoid m) =>
(:+:) sym1 sym2 m -> m
forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(:+:) sym1 sym2 a -> Bool
forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(:+:) sym1 sym2 a -> Int
forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(:+:) sym1 sym2 a -> [a]
forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(a -> a -> a) -> (:+:) sym1 sym2 a -> a
forall (sym1 :: * -> *) (sym2 :: * -> *) m a.
(Foldable sym1, Foldable sym2, Monoid m) =>
(a -> m) -> (:+:) sym1 sym2 a -> m
forall (sym1 :: * -> *) (sym2 :: * -> *) b a.
(Foldable sym1, Foldable sym2) =>
(b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b
forall (sym1 :: * -> *) (sym2 :: * -> *) a b.
(Foldable sym1, Foldable sym2) =>
(a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b
product :: (:+:) sym1 sym2 a -> a
$cproduct :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Num a) =>
(:+:) sym1 sym2 a -> a
sum :: (:+:) sym1 sym2 a -> a
$csum :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Num a) =>
(:+:) sym1 sym2 a -> a
minimum :: (:+:) sym1 sym2 a -> a
$cminimum :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Ord a) =>
(:+:) sym1 sym2 a -> a
maximum :: (:+:) sym1 sym2 a -> a
$cmaximum :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Ord a) =>
(:+:) sym1 sym2 a -> a
elem :: a -> (:+:) sym1 sym2 a -> Bool
$celem :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2, Eq a) =>
a -> (:+:) sym1 sym2 a -> Bool
length :: (:+:) sym1 sym2 a -> Int
$clength :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(:+:) sym1 sym2 a -> Int
null :: (:+:) sym1 sym2 a -> Bool
$cnull :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(:+:) sym1 sym2 a -> Bool
toList :: (:+:) sym1 sym2 a -> [a]
$ctoList :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(:+:) sym1 sym2 a -> [a]
foldl1 :: (a -> a -> a) -> (:+:) sym1 sym2 a -> a
$cfoldl1 :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(a -> a -> a) -> (:+:) sym1 sym2 a -> a
foldr1 :: (a -> a -> a) -> (:+:) sym1 sym2 a -> a
$cfoldr1 :: forall (sym1 :: * -> *) (sym2 :: * -> *) a.
(Foldable sym1, Foldable sym2) =>
(a -> a -> a) -> (:+:) sym1 sym2 a -> a
foldl' :: (b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b
$cfoldl' :: forall (sym1 :: * -> *) (sym2 :: * -> *) b a.
(Foldable sym1, Foldable sym2) =>
(b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b
foldl :: (b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b
$cfoldl :: forall (sym1 :: * -> *) (sym2 :: * -> *) b a.
(Foldable sym1, Foldable sym2) =>
(b -> a -> b) -> b -> (:+:) sym1 sym2 a -> b
foldr' :: (a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b
$cfoldr' :: forall (sym1 :: * -> *) (sym2 :: * -> *) a b.
(Foldable sym1, Foldable sym2) =>
(a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b
foldr :: (a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b
$cfoldr :: forall (sym1 :: * -> *) (sym2 :: * -> *) a b.
(Foldable sym1, Foldable sym2) =>
(a -> b -> b) -> b -> (:+:) sym1 sym2 a -> b
foldMap' :: (a -> m) -> (:+:) sym1 sym2 a -> m
$cfoldMap' :: forall (sym1 :: * -> *) (sym2 :: * -> *) m a.
(Foldable sym1, Foldable sym2, Monoid m) =>
(a -> m) -> (:+:) sym1 sym2 a -> m
foldMap :: (a -> m) -> (:+:) sym1 sym2 a -> m
$cfoldMap :: forall (sym1 :: * -> *) (sym2 :: * -> *) m a.
(Foldable sym1, Foldable sym2, Monoid m) =>
(a -> m) -> (:+:) sym1 sym2 a -> m
fold :: (:+:) sym1 sym2 m -> m
$cfold :: forall (sym1 :: * -> *) (sym2 :: * -> *) m.
(Foldable sym1, Foldable sym2, Monoid m) =>
(:+:) sym1 sym2 m -> m
Foldable, Functor (sym1 :+: sym2)
Foldable (sym1 :+: sym2)
Functor (sym1 :+: sym2)
-> Foldable (sym1 :+: sym2)
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> (:+:) sym1 sym2 a -> f ((:+:) sym1 sym2 b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    (:+:) sym1 sym2 (f a) -> f ((:+:) sym1 sym2 a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> (:+:) sym1 sym2 a -> m ((:+:) sym1 sym2 b))
-> (forall (m :: * -> *) a.
    Monad m =>
    (:+:) sym1 sym2 (m a) -> m ((:+:) sym1 sym2 a))
-> Traversable (sym1 :+: sym2)
(a -> f b) -> (:+:) sym1 sym2 a -> f ((:+:) sym1 sym2 b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
(:+:) sym1 sym2 (m a) -> m ((:+:) sym1 sym2 a)
forall (f :: * -> *) a.
Applicative f =>
(:+:) sym1 sym2 (f a) -> f ((:+:) sym1 sym2 a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (:+:) sym1 sym2 a -> m ((:+:) sym1 sym2 b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> (:+:) sym1 sym2 a -> f ((:+:) sym1 sym2 b)
forall (sym1 :: * -> *) (sym2 :: * -> *).
(Traversable sym1, Traversable sym2) =>
Functor (sym1 :+: sym2)
forall (sym1 :: * -> *) (sym2 :: * -> *).
(Traversable sym1, Traversable sym2) =>
Foldable (sym1 :+: sym2)
forall (sym1 :: * -> *) (sym2 :: * -> *) (m :: * -> *) a.
(Traversable sym1, Traversable sym2, Monad m) =>
(:+:) sym1 sym2 (m a) -> m ((:+:) sym1 sym2 a)
forall (sym1 :: * -> *) (sym2 :: * -> *) (f :: * -> *) a.
(Traversable sym1, Traversable sym2, Applicative f) =>
(:+:) sym1 sym2 (f a) -> f ((:+:) sym1 sym2 a)
forall (sym1 :: * -> *) (sym2 :: * -> *) (m :: * -> *) a b.
(Traversable sym1, Traversable sym2, Monad m) =>
(a -> m b) -> (:+:) sym1 sym2 a -> m ((:+:) sym1 sym2 b)
forall (sym1 :: * -> *) (sym2 :: * -> *) (f :: * -> *) a b.
(Traversable sym1, Traversable sym2, Applicative f) =>
(a -> f b) -> (:+:) sym1 sym2 a -> f ((:+:) sym1 sym2 b)
sequence :: (:+:) sym1 sym2 (m a) -> m ((:+:) sym1 sym2 a)
$csequence :: forall (sym1 :: * -> *) (sym2 :: * -> *) (m :: * -> *) a.
(Traversable sym1, Traversable sym2, Monad m) =>
(:+:) sym1 sym2 (m a) -> m ((:+:) sym1 sym2 a)
mapM :: (a -> m b) -> (:+:) sym1 sym2 a -> m ((:+:) sym1 sym2 b)
$cmapM :: forall (sym1 :: * -> *) (sym2 :: * -> *) (m :: * -> *) a b.
(Traversable sym1, Traversable sym2, Monad m) =>
(a -> m b) -> (:+:) sym1 sym2 a -> m ((:+:) sym1 sym2 b)
sequenceA :: (:+:) sym1 sym2 (f a) -> f ((:+:) sym1 sym2 a)
$csequenceA :: forall (sym1 :: * -> *) (sym2 :: * -> *) (f :: * -> *) a.
(Traversable sym1, Traversable sym2, Applicative f) =>
(:+:) sym1 sym2 (f a) -> f ((:+:) sym1 sym2 a)
traverse :: (a -> f b) -> (:+:) sym1 sym2 a -> f ((:+:) sym1 sym2 b)
$ctraverse :: forall (sym1 :: * -> *) (sym2 :: * -> *) (f :: * -> *) a b.
(Traversable sym1, Traversable sym2, Applicative f) =>
(a -> f b) -> (:+:) sym1 sym2 a -> f ((:+:) sym1 sym2 b)
$cp2Traversable :: forall (sym1 :: * -> *) (sym2 :: * -> *).
(Traversable sym1, Traversable sym2) =>
Foldable (sym1 :+: sym2)
$cp1Traversable :: forall (sym1 :: * -> *) (sym2 :: * -> *).
(Traversable sym1, Traversable sym2) =>
Functor (sym1 :+: sym2)
Traversable)
infixr :+:
instance (Symbol sym1, Symbol sym2) => Symbol (sym1 :+: sym2)
  where
    symSig :: (:+:) sym1 sym2 sig -> SigRep sig
symSig (InjL sym1 sig
s) = sym1 sig -> SigRep sig
forall (sym :: * -> *) sig. Symbol sym => sym sig -> SigRep sig
symSig sym1 sig
s
    symSig (InjR sym2 sig
s) = sym2 sig -> SigRep sig
forall (sym :: * -> *) sig. Symbol sym => sym sig -> SigRep sig
symSig sym2 sig
s
instance (NFData1 sym1, NFData1 sym2) => NFData1 (sym1 :+: sym2)
  where
    rnf1 :: (:+:) sym1 sym2 a -> ()
rnf1 (InjL sym1 a
s) = sym1 a -> ()
forall (c :: * -> *) a. NFData1 c => c a -> ()
rnf1 sym1 a
s
    rnf1 (InjR sym2 a
s) = sym2 a -> ()
forall (c :: * -> *) a. NFData1 c => c a -> ()
rnf1 sym2 a
s
class Project sub sup
  where
    
    prj :: sup a -> Maybe (sub a)
instance Project sub sup => Project sub (AST sup)
  where
    prj :: AST sup a -> Maybe (sub a)
prj (Sym sup a
s) = sup a -> Maybe (sub a)
forall (sub :: * -> *) (sup :: * -> *) a.
Project sub sup =>
sup a -> Maybe (sub a)
prj sup a
s
    prj AST sup a
_       = Maybe (sub a)
forall a. Maybe a
Nothing
instance {-# OVERLAPS #-} Project sym sym
  where
    prj :: sym a -> Maybe (sym a)
prj = sym a -> Maybe (sym a)
forall a. a -> Maybe a
Just
instance {-# OVERLAPS #-} Project sym1 (sym1 :+: sym2)
  where
    prj :: (:+:) sym1 sym2 a -> Maybe (sym1 a)
prj (InjL sym1 a
a) = sym1 a -> Maybe (sym1 a)
forall a. a -> Maybe a
Just sym1 a
a
    prj (:+:) sym1 sym2 a
_        = Maybe (sym1 a)
forall a. Maybe a
Nothing
instance {-# OVERLAPS #-} Project sym1 sym3 => Project sym1 (sym2 :+: sym3)
  where
    prj :: (:+:) sym2 sym3 a -> Maybe (sym1 a)
prj (InjR sym3 a
a) = sym3 a -> Maybe (sym1 a)
forall (sub :: * -> *) (sup :: * -> *) a.
Project sub sup =>
sup a -> Maybe (sub a)
prj sym3 a
a
    prj (:+:) sym2 sym3 a
_        = Maybe (sym1 a)
forall a. Maybe a
Nothing
class Project sub sup => sub :<: sup
  where
    
    inj :: sub a -> sup a
instance {-# OVERLAPS #-} (sub :<: sup) => (sub :<: AST sup)
  where
    inj :: sub a -> AST sup a
inj = sup a -> AST sup a
forall (sym :: * -> *) sig. sym sig -> AST sym sig
Sym (sup a -> AST sup a) -> (sub a -> sup a) -> sub a -> AST sup a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sub a -> sup a
forall (sub :: * -> *) (sup :: * -> *) a.
(sub :<: sup) =>
sub a -> sup a
inj
instance {-# OVERLAPS #-} (sym :<: sym)
  where
    inj :: sym a -> sym a
inj = sym a -> sym a
forall a. a -> a
id
instance {-# OVERLAPS #-} (sym1 :<: (sym1 :+: sym2))
  where
    inj :: sym1 a -> (:+:) sym1 sym2 a
inj = sym1 a -> (:+:) sym1 sym2 a
forall (sym1 :: * -> *) a (sym2 :: * -> *).
sym1 a -> (:+:) sym1 sym2 a
InjL
instance {-# OVERLAPS #-} (sym1 :<: sym3) => (sym1 :<: (sym2 :+: sym3))
  where
    inj :: sym1 a -> (:+:) sym2 sym3 a
inj = sym3 a -> (:+:) sym2 sym3 a
forall (sym2 :: * -> *) a (sym1 :: * -> *).
sym2 a -> (:+:) sym1 sym2 a
InjR (sym3 a -> (:+:) sym2 sym3 a)
-> (sym1 a -> sym3 a) -> sym1 a -> (:+:) sym2 sym3 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sym1 a -> sym3 a
forall (sub :: * -> *) (sup :: * -> *) a.
(sub :<: sup) =>
sub a -> sup a
inj
smartSym
    :: ( Signature sig
       , f   ~ SmartFun sup sig
       , sig ~ SmartSig f
       , sup ~ SmartSym f
       , sub :<: sup
       )
    => sub sig -> f
smartSym :: sub sig -> f
smartSym = sup sig -> f
forall sig f (sym :: * -> *).
(Signature sig, f ~ SmartFun sym sig, sig ~ SmartSig f,
 sym ~ SmartSym f) =>
sym sig -> f
smartSym' (sup sig -> f) -> (sub sig -> sup sig) -> sub sig -> f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sub sig -> sup sig
forall (sub :: * -> *) (sup :: * -> *) a.
(sub :<: sup) =>
sub a -> sup a
inj
smartSymTyped
    :: ( Signature sig
       , f         ~ SmartFun (Typed sup) sig
       , sig       ~ SmartSig f
       , Typed sup ~ SmartSym f
       , sub :<: sup
       , Typeable (DenResult sig)
       )
    => sub sig -> f
smartSymTyped :: sub sig -> f
smartSymTyped = Typed sup sig -> f
forall sig f (sym :: * -> *).
(Signature sig, f ~ SmartFun sym sig, sig ~ SmartSig f,
 sym ~ SmartSym f) =>
sym sig -> f
smartSym' (Typed sup sig -> f) -> (sub sig -> Typed sup sig) -> sub sig -> f
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sup sig -> Typed sup sig
forall sig (sym :: * -> *).
Typeable (DenResult sig) =>
sym sig -> Typed sym sig
Typed (sup sig -> Typed sup sig)
-> (sub sig -> sup sig) -> sub sig -> Typed sup sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sub sig -> sup sig
forall (sub :: * -> *) (sup :: * -> *) a.
(sub :<: sup) =>
sub a -> sup a
inj
data Empty :: * -> *
data E e
  where
    E :: e a -> E e
liftE :: (forall a . e a -> b) -> E e -> b
liftE :: (forall a. e a -> b) -> E e -> b
liftE forall a. e a -> b
f (E e a
a) = e a -> b
forall a. e a -> b
f e a
a
liftE2 :: (forall a b . e a -> e b -> c) -> E e -> E e -> c
liftE2 :: (forall a b. e a -> e b -> c) -> E e -> E e -> c
liftE2 forall a b. e a -> e b -> c
f (E e a
a) (E e a
b) = e a -> e a -> c
forall a b. e a -> e b -> c
f e a
a e a
b
data EF e
  where
    EF :: e (Full a) -> EF e
liftEF :: (forall a . e (Full a) -> b) -> EF e -> b
liftEF :: (forall a. e (Full a) -> b) -> EF e -> b
liftEF forall a. e (Full a) -> b
f (EF e (Full a)
a) = e (Full a) -> b
forall a. e (Full a) -> b
f e (Full a)
a
liftEF2 :: (forall a b . e (Full a) -> e (Full b) -> c) -> EF e -> EF e -> c
liftEF2 :: (forall a b. e (Full a) -> e (Full b) -> c) -> EF e -> EF e -> c
liftEF2 forall a b. e (Full a) -> e (Full b) -> c
f (EF e (Full a)
a) (EF e (Full a)
b) = e (Full a) -> e (Full a) -> c
forall a b. e (Full a) -> e (Full b) -> c
f e (Full a)
a e (Full a)
b
data Typed sym sig
  where
    Typed :: Typeable (DenResult sig) => sym sig -> Typed sym sig
instance Project sub sup => Project sub (Typed sup)
  where
    prj :: Typed sup a -> Maybe (sub a)
prj (Typed sup a
s) = sup a -> Maybe (sub a)
forall (sub :: * -> *) (sup :: * -> *) a.
Project sub sup =>
sup a -> Maybe (sub a)
prj sup a
s
injT :: (sub :<: sup, Typeable (DenResult sig)) =>
    sub sig -> AST (Typed sup) sig
injT :: sub sig -> AST (Typed sup) sig
injT = Typed sup sig -> AST (Typed sup) sig
forall (sym :: * -> *) sig. sym sig -> AST sym sig
Sym (Typed sup sig -> AST (Typed sup) sig)
-> (sub sig -> Typed sup sig) -> sub sig -> AST (Typed sup) sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sup sig -> Typed sup sig
forall sig (sym :: * -> *).
Typeable (DenResult sig) =>
sym sig -> Typed sym sig
Typed (sup sig -> Typed sup sig)
-> (sub sig -> sup sig) -> sub sig -> Typed sup sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. sub sig -> sup sig
forall (sub :: * -> *) (sup :: * -> *) a.
(sub :<: sup) =>
sub a -> sup a
inj
castExpr :: forall sym a b
    .  ASTF (Typed sym) a  
    -> ASTF (Typed sym) b  
    -> Maybe (ASTF (Typed sym) b)
castExpr :: ASTF (Typed sym) a
-> ASTF (Typed sym) b -> Maybe (ASTF (Typed sym) b)
castExpr ASTF (Typed sym) a
a ASTF (Typed sym) b
b = ASTF (Typed sym) a -> Maybe (ASTF (Typed sym) b)
forall sig.
(DenResult sig ~ a) =>
AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
cast1 ASTF (Typed sym) a
a
  where
    cast1 :: (DenResult sig ~ a) => AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
    cast1 :: AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
cast1 (AST (Typed sym) (a :-> sig)
s :$ AST (Typed sym) (Full a)
_) = AST (Typed sym) (a :-> sig) -> Maybe (ASTF (Typed sym) b)
forall sig.
(DenResult sig ~ a) =>
AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
cast1 AST (Typed sym) (a :-> sig)
s
    cast1 (Sym (Typed sym sig
_)) = ASTF (Typed sym) b -> Maybe (ASTF (Typed sym) b)
forall sig.
(DenResult sig ~ b) =>
AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
cast2 ASTF (Typed sym) b
b
      where
        cast2 :: (DenResult sig ~ b) => AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
        cast2 :: AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
cast2 (AST (Typed sym) (a :-> sig)
s :$ AST (Typed sym) (Full a)
_)        = AST (Typed sym) (a :-> sig) -> Maybe (ASTF (Typed sym) b)
forall sig.
(DenResult sig ~ b) =>
AST (Typed sym) sig -> Maybe (ASTF (Typed sym) b)
cast2 AST (Typed sym) (a :-> sig)
s
        cast2 (Sym (Typed sym sig
_)) = ASTF (Typed sym) a -> Maybe (ASTF (Typed sym) b)
forall k (a :: k) (b :: k) (c :: k -> *).
(Typeable a, Typeable b) =>
c a -> Maybe (c b)
gcast ASTF (Typed sym) a
a
  
  
  
  
  
  
  
  
  
class NFData1 c
  where
    
    rnf1 :: c a -> ()
    rnf1 c a
s = c a
s c a -> () -> ()
`seq` ()
symType :: Proxy sym -> sym sig -> sym sig
symType :: Proxy sym -> sym sig -> sym sig
symType Proxy sym
_ = sym sig -> sym sig
forall a. a -> a
id
prjP :: Project sub sup => Proxy sub -> sup sig -> Maybe (sub sig)
prjP :: Proxy sub -> sup sig -> Maybe (sub sig)
prjP Proxy sub
_ = sup sig -> Maybe (sub sig)
forall (sub :: * -> *) (sup :: * -> *) a.
Project sub sup =>
sup a -> Maybe (sub a)
prj