Agda-2.3.2.2: src/prototyping/mixfix/benchmarks/ReadPWrapper.hs
------------------------------------------------------------------------
-- A wrapper around ReadP
------------------------------------------------------------------------
{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses,
FlexibleInstances #-}
module ReadPWrapper where
import qualified ReadP
import Control.Monad
import qualified Control.Applicative as A
import qualified Parser
newtype ReadP k r' tok r = R { unR :: ReadP.ReadP tok r }
deriving (Functor, Monad, MonadPlus)
instance A.Applicative (ReadP k r' tok) where
pure = return
p1 <*> p2 = p1 >>= \f -> p2 >>= \x -> return (f x)
instance A.Alternative (ReadP k r' tok) where
empty = mzero
(<|>) = mplus
parse :: ReadP k r' tok r -> [ tok ] -> [ r ]
parse = ReadP.parse . unR
instance Parser.Parser (ReadP k r' tok) k r' tok where
sym = R . ReadP.char
choice = R . ReadP.choice . map unR
many1 = R . ReadP.many1 . unR
chainr1 (R p) (R op) = R $ ReadP.chainr1 p op
chainl1 (R p) (R op) = R $ ReadP.chainl1 p op