module Attoparsec.Data.Implicit where

import qualified Attoparsec.Data.Explicit as A
import Attoparsec.Data.Prelude
import qualified Data.Attoparsec.Text as B

-- |
-- Provides the default lenient parser for a type.
--
-- By convention, the parser should not check for the end of input.
class LenientParser a where
  lenientParser :: B.Parser a

-- | Consumes all the remaining input.
instance LenientParser Text where lenientParser :: Parser Text
lenientParser = Parser Text
A.text

-- | Consumes all the remaining input, encoding it using UTF8.
instance LenientParser ByteString where lenientParser :: Parser ByteString
lenientParser = Parser ByteString
A.utf8Bytes

instance LenientParser Char where lenientParser :: Parser Char
lenientParser = Parser Char
A.char

instance LenientParser Bool where lenientParser :: Parser Bool
lenientParser = Parser Bool
A.bool

instance LenientParser Integer where lenientParser :: Parser Integer
lenientParser = forall a. Integral a => Parser a
A.signedIntegral

instance LenientParser Int where lenientParser :: Parser Int
lenientParser = forall a. Integral a => Parser a
A.signedIntegral

instance LenientParser Int8 where lenientParser :: Parser Int8
lenientParser = forall a. Integral a => Parser a
A.signedIntegral

instance LenientParser Int16 where lenientParser :: Parser Int16
lenientParser = forall a. Integral a => Parser a
A.signedIntegral

instance LenientParser Int32 where lenientParser :: Parser Int32
lenientParser = forall a. Integral a => Parser a
A.signedIntegral

instance LenientParser Int64 where lenientParser :: Parser Int64
lenientParser = forall a. Integral a => Parser a
A.signedIntegral

instance LenientParser Word where lenientParser :: Parser Word
lenientParser = forall a. Integral a => Parser a
A.unsignedIntegral

instance LenientParser Word8 where lenientParser :: Parser Word8
lenientParser = forall a. Integral a => Parser a
A.unsignedIntegral

instance LenientParser Word16 where lenientParser :: Parser Word16
lenientParser = forall a. Integral a => Parser a
A.unsignedIntegral

instance LenientParser Word32 where lenientParser :: Parser Word32
lenientParser = forall a. Integral a => Parser a
A.unsignedIntegral

instance LenientParser Word64 where lenientParser :: Parser Word64
lenientParser = forall a. Integral a => Parser a
A.unsignedIntegral

instance LenientParser Double where lenientParser :: Parser Double
lenientParser = Parser Double
A.double

instance LenientParser Scientific where lenientParser :: Parser Scientific
lenientParser = Parser Scientific
A.scientific

instance LenientParser TimeOfDay where lenientParser :: Parser TimeOfDay
lenientParser = Parser TimeOfDay
A.timeOfDayInISO8601

instance LenientParser Day where lenientParser :: Parser Day
lenientParser = Parser Day
A.dayInISO8601

instance LenientParser TimeZone where lenientParser :: Parser TimeZone
lenientParser = Parser TimeZone
A.timeZoneInISO8601

instance LenientParser UTCTime where lenientParser :: Parser UTCTime
lenientParser = Parser UTCTime
A.utcTimeInISO8601

instance LenientParser DiffTime where lenientParser :: Parser DiffTime
lenientParser = Parser DiffTime
A.diffTime

instance LenientParser NominalDiffTime where lenientParser :: Parser NominalDiffTime
lenientParser = Parser NominalDiffTime
A.nominalDiffTime

instance LenientParser String where lenientParser :: Parser String
lenientParser = Parser String
A.string

instance LenientParser UUID where lenientParser :: Parser UUID
lenientParser = Parser UUID
A.uuid