module Test.Hspec.Attoparsec.Source where
import qualified Data.Attoparsec.ByteString as AB
import qualified Data.ByteString as B
import qualified Data.Attoparsec.ByteString.Lazy as ALB
import qualified Data.ByteString.Lazy as LB
import qualified Data.Attoparsec.Text as AT
import qualified Data.Text as T
import qualified Data.Attoparsec.Text.Lazy as ALT
import qualified Data.Text.Lazy as LT
import qualified Data.Attoparsec.Types as Atto
import Data.String (IsString)
class (Eq string, Show string, IsString string)
=> Source parser string string' result | string -> parser, string -> result, string -> string' where
(~>) :: string -> parser string' a -> Either String a
(~?>) :: string -> parser string' a -> result a
instance Source Atto.Parser B.ByteString B.ByteString AB.Result where
t ~> p = AB.parseOnly p t
t ~?> p = AB.parse p t
instance Source Atto.Parser LB.ByteString B.ByteString ALB.Result where
t ~> p = ALB.eitherResult $ t ~?> p
t ~?> p = ALB.parse p t
instance Source Atto.Parser T.Text T.Text AT.Result where
t ~> p = AT.parseOnly p t
t ~?> p = AT.parse p t
instance Source Atto.Parser LT.Text T.Text ALT.Result where
t ~> p = ALT.eitherResult $ t ~?> p
t ~?> p = ALT.parse p t
class Leftover r s | r -> s where
leftover :: r a -> Maybe s
instance Leftover AB.Result B.ByteString where
leftover (AB.Done t _) = Just t
leftover _ = Nothing
instance Leftover ALB.Result LB.ByteString where
leftover (ALB.Done t _) = Just t
leftover _ = Nothing
instance Leftover AT.Result T.Text where
leftover (AT.Done t _) = Just t
leftover _ = Nothing
instance Leftover ALT.Result LT.Text where
leftover (ALT.Done t _) = Just t
leftover _ = Nothing