-parse :: Parser a -> ByteString -> Maybe (a, ByteString)
-parse p input = case runState (runParser p) input of
- (Just a , input') -> Just (a, input')
- (Nothing, _ ) -> Nothing
+-- (>>=) :: Parser a -> (a -> Parser b) -> Parser b
+instance Monad Parser where
+ p >>= f = Parser $! do saved@(_, isEOFFatal) <- get -- 失敗した時の爲に状態を保存
+ result <- runParser p
+ case result of
+ Success a -> a `seq` runParser (f a)
+ IllegalInput -> do put saved -- 状態を復歸
+ return IllegalInput
+ ReachedEOF -> do unless isEOFFatal
+ $ put saved -- 状態を復歸
+ return ReachedEOF
+ return x = x `seq` Parser $! return $! Success x
+ fail _ = Parser $! return $! IllegalInput
+
+-- |@'parse' p bstr@ parses @bstr@ with @p@ and returns @(result,
+-- remaining)@.
+parse :: Parser a -> ByteString -> (ParserResult a, ByteString)
+parse p input -- input は lazy である必要有り。
+ = p `seq`
+ let (result, (input', _)) = runState (runParser p) (input, True)
+ in
+ result `seq` (result, input') -- input' も lazy である必要有り。
+
+-- |@'parseStr' p str@ packs @str@ and parses it.
+parseStr :: Parser a -> String -> (ParserResult a, ByteString)
+parseStr p input
+ = p `seq` -- input は lazy である必要有り。
+ parse p $! B.pack input