-- | Utils

module Pdf.Core.Parsers.Util
(
  endOfLine
)
where

import Data.Attoparsec.ByteString (Parser)
import qualified Data.Attoparsec.ByteString.Char8 as P
import Control.Applicative (many)

-- | In pdf file EOL could be \"\\n\", \"\\r\" or \"\\n\\r\"
--
-- Also space (0x20) is usually ok before EOL
endOfLine :: Parser ()
endOfLine :: Parser ()
endOfLine = do
  [Char]
_ <- Parser ByteString Char -> Parser ByteString [Char]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (Parser ByteString Char -> Parser ByteString [Char])
-> Parser ByteString Char -> Parser ByteString [Char]
forall a b. (a -> b) -> a -> b
$ Char -> Parser ByteString Char
P.char Char
' '
  [Parser ()] -> Parser ()
forall (f :: * -> *) a. Alternative f => [f a] -> f a
P.choice [
    Parser ()
P.endOfLine, -- it already handles both the \n and \n\r
    Char -> Parser ByteString Char
P.char Char
'\r' Parser ByteString Char -> (Char -> Parser ()) -> Parser ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser () -> Char -> Parser ()
forall a b. a -> b -> a
const (() -> Parser ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
    ]