{-# LANGUAGE Rank2Types #-}

-- |
-- Module      : Text.Syntax.Poly.Type
-- Copyright   : 2012 Kei Hibino
-- License     : BSD3
--
-- Maintainer  : ex8k.hibino@gmail.com
-- Stability   : experimental
-- Portability : unknown
--
-- This module contains handy Rank2 type synonyms which has 'Syntax' contexts.
module Text.Syntax.Poly.Type (
  -- * Syntax type
  SyntaxT,
  -- * Type to run syntax as Parser \/ Printer.
  RunAsParser, RunAsParserM,
  RunAsPrinter, RunAsPrinterM,
  -- * Error string type
  ErrorString, errorString
  ) where

import Text.Syntax.Poly.Class (Syntax)

-- | Type synonym for 'Syntax' includes contexts. Rank2Types extension is needed.
type SyntaxT tok a = forall delta . Syntax tok delta => delta a

-- | Type to run syntax as parser
type RunAsParser     tok tks a e = SyntaxT tok a -> tks -> Either e a
-- | Same as 'RunAsParser' other than with computation @m@
type RunAsParserM  m tok tks a e = SyntaxT tok a -> tks -> m (Either e a)

-- | Type to run syntax as printer
type RunAsPrinter    tok tks a e = SyntaxT tok a -> a   -> Either e tks
-- | Same as 'RunAsPrinter' other than with computation @m@
type RunAsPrinterM m tok tks a e = SyntaxT tok a -> a   -> m (Either e tks)

-- | String type which is 'Show' instance not to show but just return String
newtype ErrorString = ErrorString String

-- | Construct 'ErrorString'
errorString :: String -> ErrorString
errorString =  ErrorString

instance Show ErrorString where
  show (ErrorString s) = s