Reflect the distinction between eval and run from State monad into the Parser module
This commit is contained in:
parent
51db57ec67
commit
66d315b7fe
3 changed files with 11 additions and 8 deletions
|
@ -21,7 +21,7 @@ import PDF.Object (
|
|||
)
|
||||
import qualified PDF.Output as Output (render, line)
|
||||
import PDF.Output (Output(..))
|
||||
import PDF.Parser (Parser, runParser, string, takeAll)
|
||||
import PDF.Parser (Parser, evalParser, string, takeAll)
|
||||
import Text.Printf (printf)
|
||||
|
||||
data Document = Document {
|
||||
|
@ -83,7 +83,7 @@ findNextSection offset input =
|
|||
|
||||
readStructures :: Int -> ByteString -> Either String [InputStructure]
|
||||
readStructures startXref input =
|
||||
runParser structure () (BS.drop startXref input) >>= stopOrFollow
|
||||
evalParser structure () (BS.drop startXref input) >>= stopOrFollow
|
||||
where
|
||||
stopOrFollow s@(Structure {trailer}) =
|
||||
case Map.lookup (Name "Prev") trailer of
|
||||
|
@ -96,7 +96,7 @@ readStructures startXref input =
|
|||
|
||||
parseDocument :: ByteString -> Either String Document
|
||||
parseDocument input = do
|
||||
(pdfVersion, eolStyle) <- runParser ((,) <$> version <*> EOL.parser) () input
|
||||
(pdfVersion, eolStyle) <- evalParser ((,) <$> version <*> EOL.parser) () input
|
||||
startXref <- readStartXref eolStyle input
|
||||
structuresRead <- readStructures startXref input
|
||||
let updates = populate input <$> structuresRead
|
||||
|
|
|
@ -18,7 +18,7 @@ import PDF.Object (
|
|||
, blank, dictionary, directObject, integer, line
|
||||
)
|
||||
import PDF.Output (ObjectId(..), Offset(..))
|
||||
import PDF.Parser (Parser, (<?>), block, char, on, option, runParser, takeAll)
|
||||
import PDF.Parser (Parser, (<?>), block, char, evalParser, on, option, takeAll)
|
||||
|
||||
data UserState = UserState {
|
||||
input :: ByteString
|
||||
|
@ -109,7 +109,7 @@ occurrence =
|
|||
populate :: ByteString -> InputStructure -> Content
|
||||
populate input structure =
|
||||
let bodyInput = BS.drop (startOffset structure) input in
|
||||
case runParser recurseOnOccurrences initialState bodyInput of
|
||||
case evalParser recurseOnOccurrences initialState bodyInput of
|
||||
Left _ -> Content {occurrences = [], objects = Map.empty, docStructure}
|
||||
Right finalState ->
|
||||
let Flow {occurrencesStack, tmpObjects} = flow finalState in
|
||||
|
|
|
@ -13,6 +13,7 @@ module PDF.Parser (
|
|||
, oneOf
|
||||
, option
|
||||
, runParser
|
||||
, evalParser
|
||||
, sepBy
|
||||
, string
|
||||
, takeAll
|
||||
|
@ -80,9 +81,11 @@ oneOf charSet = lift $ Atto.satisfy (`elem` charSet)
|
|||
option :: a -> Parser s a -> Parser s a
|
||||
option defaultValue p = p <|> pure defaultValue
|
||||
|
||||
runParser :: Parser s a -> s -> ByteString -> Either String a
|
||||
runParser parser initState =
|
||||
Atto.parseOnly (evalStateT parser initState)
|
||||
runParser :: Parser s a -> s -> ByteString -> Either String (a, s)
|
||||
runParser parser initState = Atto.parseOnly (runStateT parser initState)
|
||||
|
||||
evalParser :: Parser s a -> s -> ByteString -> Either String a
|
||||
evalParser parser initState = Atto.parseOnly (evalStateT parser initState)
|
||||
|
||||
sepBy :: Parser s a -> Parser s b -> Parser s [a]
|
||||
sepBy parser separator =
|
||||
|
|
Loading…
Reference in a new issue