module Text.Trifecta.Parser.ByteString
( parseFromFile
, parseFromFileEx
, parseByteString
, parseTest
) where
import Control.Applicative
import Control.Monad (unless)
import Data.Semigroup
import Data.Foldable
import qualified Data.ByteString as B
import System.Console.Terminfo.PrettyPrint
import Text.Trifecta.Parser.Mark
import Text.Trifecta.Parser.Prim
import Text.Trifecta.Parser.Step
import Text.Trifecta.Rope.Delta
import Text.Trifecta.Parser.Result
import Data.Sequence as Seq
import qualified Data.ByteString.UTF8 as UTF8
parseFromFile :: Show a => (forall r. Parser r String a) -> String -> IO (Maybe a)
parseFromFile p fn = do
result <- parseFromFileEx p fn
case result of
Success xs a -> Just a <$ unless (Seq.null xs) (displayLn (toList xs))
Failure xs -> Nothing <$ unless (Seq.null xs) (displayLn (toList xs))
parseFromFileEx :: Show a => (forall r. Parser r String a) -> String -> IO (Result TermDoc a)
parseFromFileEx p fn = parseByteString p (Directed (UTF8.fromString fn) 0 0 0 0) <$> B.readFile fn
parseByteString :: Show a => (forall r. Parser r String a) -> Delta -> UTF8.ByteString -> Result TermDoc a
parseByteString p d inp = starve
$ feed inp
$ stepParser (fmap prettyTerm)
(why prettyTerm)
(release d *> p)
mempty
True
mempty
mempty
parseTest :: Show a => (forall r. Parser r String a) -> String -> IO ()
parseTest p s = case parseByteString p mempty (UTF8.fromString s) of
Failure xs -> displayLn $ toList xs
Success xs a -> do
unless (Seq.null xs) $ displayLn $ toList xs
print a