module Text.Roundtrip.Classes where

--import Prelude ()

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
  -- one token lookahead for lhs
  (<|>)  :: f alpha -> f alpha -> f alpha
  -- infinite lookahead for lhs
  (<||>) :: f alpha -> f alpha -> f alpha
  empty  :: f alpha

class (IsoFunctor delta, ProductFunctor delta, Alternative delta)
   => Syntax delta where
  -- (<$>)   ::  Iso alpha beta -> delta alpha -> delta beta
  -- (<*>)   ::  delta alpha -> delta beta -> delta (alpha, beta)
  -- (<|>)   ::  delta alpha -> delta alpha -> delta alpha
  -- empty   ::  delta alpha
  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