{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeSynonymInstances #-} module Language.PiSigma.Util.String.Parser ( String , append , fromString , isPrefixOf , lines , null , readFile , span , toString , uncons , unlines ) where import Prelude hiding ( String , lines , null , readFile , replicate , span , unlines ) import qualified Prelude as Prelude import qualified Data.ByteString.Lazy as Lazy import qualified Data.ByteString.Lazy.UTF8 as LazyUTF8 import qualified Data.String as String -- * The parser input type type String = LazyUTF8.ByteString instance String.IsString String where fromString = fromString append :: String -> String -> String append = Lazy.append fromString :: Prelude.String -> String fromString = LazyUTF8.fromString isPrefixOf :: String -> String -> Bool isPrefixOf = Lazy.isPrefixOf lines :: String -> [String] lines = LazyUTF8.lines null :: String -> Bool null = Lazy.null readFile :: FilePath -> IO String readFile = Lazy.readFile span :: (Char -> Bool) -> String -> (String, String) span = LazyUTF8.span toString :: String -> Prelude.String toString = LazyUTF8.toString uncons :: String -> Maybe (Char, String) uncons = LazyUTF8.uncons unlines :: [String] -> String unlines = Lazy.intercalate "\n" -- NOTE: Commenting out the code above and uncommenting the code below -- results in an incredible slowdown during parsing. I'm not sure why -- this is since Data.Text should be pretty fast. Using strict versus -- lazy Data.Text is even worse. -- import Control.Monad -- ( liftM ) -- import qualified Data.ByteString.Lazy -- as Word8 -- import qualified Data.Text.Lazy -- as Text -- import qualified Data.Text.Lazy.Encoding -- as Text -- type String = Text.Text -- append :: String -> String -> String -- append = Text.append -- fromString :: Prelude.String -> String -- fromString = Text.pack -- isPrefixOf :: String -> String -> Bool -- isPrefixOf = Text.isPrefixOf -- lines :: String -> [String] -- lines = Text.lines -- null :: String -> Bool -- null = Text.null -- readFile :: FilePath -> IO String -- readFile = liftM Text.decodeUtf8 . Word8.readFile -- span :: (Char -> Bool) -> String -> (String, String) -- span = Text.spanBy -- toString :: String -> Prelude.String -- toString = Text.unpack -- uncons :: String -> Maybe (Char, String) -- uncons = Text.uncons -- unlines :: [String] -> String -- unlines = Text.unlines