{-# LANGUAGE DataKinds #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeFamilies #-} module Machine where import Data.Text (Text) import Data.Functor ((<$>)) import qualified Symantic.Parser as P import Grammar -- | Existential type to gather machines -- returning different values in the same @('machines')@ list. data M = forall a. M ( forall repr inp. inp ~ Text => P.Machine (P.InputToken inp) repr => repr inp '[] a ) machines :: [M] machines = (\(G g) -> M (P.machine g)) <$> grammars