{-# LANGUAGE AllowAmbiguousTypes #-}
module Language.Egison.Parser.Pattern.Prim.Source
( Source(..)
, Token
, Tokens
)
where
import Data.Text ( Text )
import qualified Data.Text as T
( null
, cons
, snoc
)
import qualified Text.Megaparsec as Parsec
( Stream(..) )
import Language.Egison.Parser.Pattern.Token
( IsToken )
type Token s = Parsec.Token s
type Tokens s = Parsec.Tokens s
class (Parsec.Stream s, IsToken (Token s)) => Source s where
eof :: s -> Bool
tokens :: s -> Tokens s
consTokens :: Token s -> Tokens s -> Tokens s
snocTokens :: Tokens s -> Token s -> Tokens s
instance Source Text where
eof = T.null
tokens = id
consTokens = T.cons
snocTokens = T.snoc
instance Source String where
eof = null
tokens = id
consTokens = (:)
snocTokens xs x = xs ++ [x]