module Generics.Spine.Base where
data Type :: * -> * where
Char :: Type Char
Int :: Type Int
Bool :: Type Bool
List :: Type a -> Type [a]
Pair :: Type a -> Type b -> Type (a, b)
data Typed a = (:>) { typeOf :: Type a, val :: a }
infixl 1 :>
data Constr a = Constr { constr :: a, name :: String }
data Spine :: * -> * where
Con :: Constr a -> Spine a
(:<>:) :: Spine (a -> b) -> Typed a -> Spine b
infixl 0 :<>:
type Datatype a = [Signature a]
data Signature :: * -> * where
Sig :: Constr a -> Signature a
(:&:) :: Signature (a -> b) -> Type a -> Signature b
infixl 0 :&: