Use peek to improve directObject parser avoiding a large <|> disjunction
This commit is contained in:
parent
195446e653
commit
32f9866106
|
@ -220,16 +220,18 @@ instance Output DirectObject where
|
|||
Output.string (printf "%d %d R" (getObjectId objectId) versionNumber)
|
||||
|
||||
directObject :: MonadParser m => m DirectObject
|
||||
directObject =
|
||||
Boolean <$> boolean
|
||||
<|> Reference <$> reference {- defined before Number because Number is a prefix of it -}
|
||||
<|> NumberObject <$> number
|
||||
<|> StringObject <$> stringObject
|
||||
<|> NameObject <$> name
|
||||
<|> Array <$> array
|
||||
<|> Dictionary <$> dictionary
|
||||
<|> const Null <$> nullObject
|
||||
<?> "direct object"
|
||||
directObject = (peek >>= dispatch) <?> "direct object"
|
||||
where
|
||||
dispatch 't' = Boolean <$> boolean
|
||||
dispatch 'f' = Boolean <$> boolean
|
||||
dispatch '(' = StringObject <$> stringObject
|
||||
dispatch '<' = StringObject <$> stringObject <|> Dictionary <$> dictionary
|
||||
dispatch '/' = NameObject <$> name
|
||||
dispatch '[' = Array <$> array
|
||||
dispatch 'n' = nullObject *> return Null
|
||||
dispatch _ =
|
||||
Reference <$> reference {- defined before Number because Number is a prefix of it -}
|
||||
<|> NumberObject <$> number
|
||||
|
||||
--
|
||||
-- Object
|
||||
|
|
|
@ -17,8 +17,8 @@ import Control.Monad.Fail (MonadFail(..))
|
|||
import Control.Monad.State (StateT(..), evalStateT)
|
||||
import Control.Monad.Trans (MonadTrans(..))
|
||||
import qualified Data.Attoparsec.ByteString.Char8 as Atto (
|
||||
Parser, char, endOfInput, parseOnly, satisfy, string, take, takeWhile
|
||||
, takeWhile1
|
||||
Parser, char, endOfInput, parseOnly, peekChar', satisfy, string, take
|
||||
, takeWhile, takeWhile1
|
||||
)
|
||||
import Data.ByteString (ByteString)
|
||||
import Data.ByteString.Char8.Util (B16Int(..))
|
||||
|
@ -36,6 +36,7 @@ class MonadDeps m => MonadParser m where
|
|||
endOfInput :: m ()
|
||||
hexNumber :: m B16Int
|
||||
oneOf :: String -> m Char
|
||||
peek :: m Char
|
||||
string :: ByteString -> m ByteString
|
||||
takeAll :: (Char -> Bool) -> m ByteString
|
||||
takeAll1 :: (Char -> Bool) -> m ByteString
|
||||
|
@ -47,6 +48,7 @@ instance MonadParser Atto.Parser where
|
|||
decNumber = Atto.takeWhile1 (`Set.member` digits)
|
||||
hexNumber = B16Int <$> Atto.takeWhile1 (`Set.member` hexDigits)
|
||||
oneOf charSet = Atto.satisfy (`elem` charSet)
|
||||
peek = Atto.peekChar'
|
||||
string s = Atto.string s <?> show s
|
||||
takeAll = Atto.takeWhile
|
||||
takeAll1 = Atto.takeWhile1
|
||||
|
@ -58,6 +60,7 @@ instance (MonadParser m, MonadTrans t, MonadDeps (t m)) => MonadParser (t m) whe
|
|||
decNumber = lift $ decNumber
|
||||
hexNumber = lift $ hexNumber
|
||||
oneOf = lift . oneOf
|
||||
peek = lift $ peek
|
||||
string = lift . string
|
||||
takeAll = lift . takeAll
|
||||
takeAll1 = lift . takeAll1
|
||||
|
|
Loading…
Reference in New Issue