module Text.Roundtrip.Classes where
import Control.Isomorphism.Partial (IsoFunctor)
import Data.Eq (Eq)
import Data.Char (Char)
infixl 3 <|>
infixl 3 <||>
infixr 6 <*>
class ProductFunctor f where
(<*>) :: f alpha -> f beta -> f (alpha, beta)
class Alternative f where
(<|>) :: f alpha -> f alpha -> f alpha
(<||>) :: f alpha -> f alpha -> f alpha
empty :: f alpha
class (IsoFunctor delta, ProductFunctor delta, Alternative delta)
=> Syntax delta where
pure :: Eq alpha => alpha -> delta alpha
rule :: String -> delta beta -> delta alpha -> delta alpha
rule _ _ x = x
ruleInfix :: String -> delta beta -> delta gamma -> delta alpha -> delta alpha
ruleInfix _ _ _ x = x
class Syntax delta => StringSyntax delta where
token :: delta Char