- p >>= f = Parser $ do saved@(_, isEOFFatal) <- get -- 失敗した時の爲に状態を保存
- result <- runParser p
- case result of
- Success a -> runParser (f a)
- IllegalInput -> do put saved -- 状態を復歸
- return IllegalInput
- ReachedEOF -> do unless isEOFFatal
- $ put saved -- 状態を復歸
- return ReachedEOF
- return = Parser . return . Success
- fail _ = Parser $ return IllegalInput
+ p >>= f = Parser $! do saved <- get -- 失敗した時の爲に状態を保存
+ result <- runParser p
+ case result of
+ Success a -> runParser (f a)
+ IllegalInput -> do put saved -- 状態を復歸
+ return IllegalInput
+ ReachedEOF -> do put saved -- 状態を復歸
+ return ReachedEOF
+ return x = x `seq` Parser $! return $! Success x
+ fail _ = Parser $! return $! IllegalInput
+
+-- |@'failP'@ is just a synonym for @'Prelude.fail Prelude.undefined'@.
+failP :: Parser a
+failP = fail undefined