{-# LANGUAGE CPP #-}

#ifndef MIN_VERSION_parsec
#define MIN_VERSION_parsec(x,y,z) 0
#endif

#if MIN_VERSION_parsec(3,0,0)
module Parsec (
      module Control.Applicative
    , module Text.Parsec
    , module Text.Parsec.String
    ) where

import Control.Applicative hiding (many,optional,(<|>))
import Text.Parsec
import Text.Parsec.String
#else
module Parsec (
      module Text.ParserCombinators.Parsec
    , (<$>), (<$), (<*>), (<*), (*>), pure
    ) where

import Control.Monad (ap, liftM)
import Text.ParserCombinators.Parsec

{-
  GenParser cannot be an instance of Applicative and Alternative
  due to the overlapping instances error, sigh!
-}

(<$>) :: Monad m => (a -> b) -> m a -> m b
(<$>) = liftM

(<$) :: Monad m => a -> m b -> m a
a <$ m = m >> return a

(<*>) :: Monad m => m (a -> b) -> m a -> m b
(<*>) = ap

(*>) :: Monad m => m a -> m b -> m b
(*>) = (>>)

(<*) :: Monad m => m a -> m b -> m a
m1 <* m2 = do x <- m1
              m2
              return x

pure :: Monad m => a -> m a
pure = return

infixl 4 <$>, <$, <*>, <*, *>
#endif