diff options
| author | Simon Hengel <sol@typeful.net> | 2014-11-16 08:58:40 +0800 | 
|---|---|---|
| committer | Simon Hengel <sol@typeful.net> | 2014-11-16 10:20:19 +0800 | 
| commit | 06517a6a4c5c6c7a89ea4ad57d85ffc458393a07 (patch) | |
| tree | aa06a22a299eb9d8f7e5efa5528a7c31534bd6d3 /haddock-library/src/Documentation/Haddock/Parser | |
| parent | c2b84c0c55bce1120db9826391de0466c33b3062 (diff) | |
(wip) Add support for @since (closes #26)
Diffstat (limited to 'haddock-library/src/Documentation/Haddock/Parser')
| -rw-r--r-- | haddock-library/src/Documentation/Haddock/Parser/Monad.hs | 33 | 
1 files changed, 27 insertions, 6 deletions
diff --git a/haddock-library/src/Documentation/Haddock/Parser/Monad.hs b/haddock-library/src/Documentation/Haddock/Parser/Monad.hs index 19edce04..a421c58c 100644 --- a/haddock-library/src/Documentation/Haddock/Parser/Monad.hs +++ b/haddock-library/src/Documentation/Haddock/Parser/Monad.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE GeneralizedNewtypeDeriving, TypeFamilies #-}  module Documentation.Haddock.Parser.Monad (    module Documentation.Haddock.Parser.Monad  , Attoparsec.isDigit @@ -34,17 +34,38 @@ import           Data.String  import           Data.ByteString (ByteString)  import qualified Data.ByteString.Lazy as LB  import qualified Data.Attoparsec.ByteString.Char8 as Attoparsec +import           Control.Monad.Trans.State +import qualified Control.Monad.Trans.Class as Trans  import           Data.Word  import           Data.Bits +import           Data.Tuple -newtype Parser a = Parser (Attoparsec.Parser a) -  deriving (Functor, Applicative, Alternative, Monad, MonadPlus, IsString) +import           Documentation.Haddock.Types (Version) -parseOnly :: Parser a -> ByteString -> Either String a -parseOnly (Parser p) = Attoparsec.parseOnly p +data ParserState = ParserState { +  parserStateSince :: Maybe Version +} deriving (Eq, Show) + +initialParserState :: ParserState +initialParserState = ParserState Nothing + +newtype Parser a = Parser (StateT ParserState Attoparsec.Parser a) +  deriving (Functor, Applicative, Alternative, Monad, MonadPlus) + +instance (a ~ ByteString) => IsString (Parser a) where +  fromString = lift . fromString + +parseOnly :: Parser a -> ByteString -> Either String (ParserState, a) +parseOnly (Parser p) = fmap swap . Attoparsec.parseOnly (runStateT p initialParserState)  lift :: Attoparsec.Parser a -> Parser a -lift = Parser +lift = Parser . Trans.lift + +setParserState :: ParserState -> Parser () +setParserState = Parser . put + +setSince :: Version -> Parser () +setSince since = Parser $ modify (\st -> st {parserStateSince = Just since})  char :: Char -> Parser Char  char = lift . Attoparsec.char  | 
