module PostgresqlTypes.Via.IsScalar where

import qualified Data.Attoparsec.Text as Attoparsec
import qualified Data.Text as Text
import PostgresqlTypes.Algebra
import PostgresqlTypes.Prelude

newtype ViaIsScalar a = ViaIsScalar a
  deriving newtype (ViaIsScalar a -> ViaIsScalar a -> Bool
(ViaIsScalar a -> ViaIsScalar a -> Bool)
-> (ViaIsScalar a -> ViaIsScalar a -> Bool) -> Eq (ViaIsScalar a)
forall a. Eq a => ViaIsScalar a -> ViaIsScalar a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => ViaIsScalar a -> ViaIsScalar a -> Bool
== :: ViaIsScalar a -> ViaIsScalar a -> Bool
$c/= :: forall a. Eq a => ViaIsScalar a -> ViaIsScalar a -> Bool
/= :: ViaIsScalar a -> ViaIsScalar a -> Bool
Eq, Eq (ViaIsScalar a)
Eq (ViaIsScalar a) =>
(ViaIsScalar a -> ViaIsScalar a -> Ordering)
-> (ViaIsScalar a -> ViaIsScalar a -> Bool)
-> (ViaIsScalar a -> ViaIsScalar a -> Bool)
-> (ViaIsScalar a -> ViaIsScalar a -> Bool)
-> (ViaIsScalar a -> ViaIsScalar a -> Bool)
-> (ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a)
-> (ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a)
-> Ord (ViaIsScalar a)
ViaIsScalar a -> ViaIsScalar a -> Bool
ViaIsScalar a -> ViaIsScalar a -> Ordering
ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (ViaIsScalar a)
forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> Bool
forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> Ordering
forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a
$ccompare :: forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> Ordering
compare :: ViaIsScalar a -> ViaIsScalar a -> Ordering
$c< :: forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> Bool
< :: ViaIsScalar a -> ViaIsScalar a -> Bool
$c<= :: forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> Bool
<= :: ViaIsScalar a -> ViaIsScalar a -> Bool
$c> :: forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> Bool
> :: ViaIsScalar a -> ViaIsScalar a -> Bool
$c>= :: forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> Bool
>= :: ViaIsScalar a -> ViaIsScalar a -> Bool
$cmax :: forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a
max :: ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a
$cmin :: forall a. Ord a => ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a
min :: ViaIsScalar a -> ViaIsScalar a -> ViaIsScalar a
Ord, Gen (ViaIsScalar a)
Gen (ViaIsScalar a)
-> (ViaIsScalar a -> [ViaIsScalar a]) -> Arbitrary (ViaIsScalar a)
ViaIsScalar a -> [ViaIsScalar a]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
forall a. Arbitrary a => Gen (ViaIsScalar a)
forall a. Arbitrary a => ViaIsScalar a -> [ViaIsScalar a]
$carbitrary :: forall a. Arbitrary a => Gen (ViaIsScalar a)
arbitrary :: Gen (ViaIsScalar a)
$cshrink :: forall a. Arbitrary a => ViaIsScalar a -> [ViaIsScalar a]
shrink :: ViaIsScalar a -> [ViaIsScalar a]
Arbitrary, Parser (ViaIsScalar a)
Variable (Either DecodingError (ViaIsScalar a))
Tagged (ViaIsScalar a) [Text]
Tagged (ViaIsScalar a) (Maybe Word32)
Tagged (ViaIsScalar a) (Maybe Text)
Tagged (ViaIsScalar a) Text
Tagged (ViaIsScalar a) (Maybe Text)
-> Tagged (ViaIsScalar a) Text
-> Tagged (ViaIsScalar a) (Maybe Word32)
-> Tagged (ViaIsScalar a) (Maybe Word32)
-> Tagged (ViaIsScalar a) [Text]
-> Tagged (ViaIsScalar a) Text
-> (ViaIsScalar a -> Write)
-> Variable (Either DecodingError (ViaIsScalar a))
-> (ViaIsScalar a -> TextBuilder)
-> Parser (ViaIsScalar a)
-> IsScalar (ViaIsScalar a)
ViaIsScalar a -> Write
ViaIsScalar a -> TextBuilder
forall a. IsScalar a => Parser (ViaIsScalar a)
forall a.
IsScalar a =>
Variable (Either DecodingError (ViaIsScalar a))
forall a. IsScalar a => Tagged (ViaIsScalar a) [Text]
forall a. IsScalar a => Tagged (ViaIsScalar a) (Maybe Word32)
forall a. IsScalar a => Tagged (ViaIsScalar a) (Maybe Text)
forall a. IsScalar a => Tagged (ViaIsScalar a) Text
forall a. IsScalar a => ViaIsScalar a -> Write
forall a. IsScalar a => ViaIsScalar a -> TextBuilder
forall a.
Tagged a (Maybe Text)
-> Tagged a Text
-> Tagged a (Maybe Word32)
-> Tagged a (Maybe Word32)
-> Tagged a [Text]
-> Tagged a Text
-> (a -> Write)
-> Variable (Either DecodingError a)
-> (a -> TextBuilder)
-> Parser a
-> IsScalar a
$cschemaName :: forall a. IsScalar a => Tagged (ViaIsScalar a) (Maybe Text)
schemaName :: Tagged (ViaIsScalar a) (Maybe Text)
$ctypeName :: forall a. IsScalar a => Tagged (ViaIsScalar a) Text
typeName :: Tagged (ViaIsScalar a) Text
$cbaseOid :: forall a. IsScalar a => Tagged (ViaIsScalar a) (Maybe Word32)
baseOid :: Tagged (ViaIsScalar a) (Maybe Word32)
$carrayOid :: forall a. IsScalar a => Tagged (ViaIsScalar a) (Maybe Word32)
arrayOid :: Tagged (ViaIsScalar a) (Maybe Word32)
$ctypeParams :: forall a. IsScalar a => Tagged (ViaIsScalar a) [Text]
typeParams :: Tagged (ViaIsScalar a) [Text]
$ctypeSignature :: forall a. IsScalar a => Tagged (ViaIsScalar a) Text
typeSignature :: Tagged (ViaIsScalar a) Text
$cbinaryEncoder :: forall a. IsScalar a => ViaIsScalar a -> Write
binaryEncoder :: ViaIsScalar a -> Write
$cbinaryDecoder :: forall a.
IsScalar a =>
Variable (Either DecodingError (ViaIsScalar a))
binaryDecoder :: Variable (Either DecodingError (ViaIsScalar a))
$ctextualEncoder :: forall a. IsScalar a => ViaIsScalar a -> TextBuilder
textualEncoder :: ViaIsScalar a -> TextBuilder
$ctextualDecoder :: forall a. IsScalar a => Parser (ViaIsScalar a)
textualDecoder :: Parser (ViaIsScalar a)
IsScalar)

instance (IsScalar a) => Show (ViaIsScalar a) where
  showsPrec :: Int -> ViaIsScalar a -> ShowS
showsPrec Int
d (ViaIsScalar a
a) = Int -> TextBuilder -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
d (a -> TextBuilder
forall a. IsScalar a => a -> TextBuilder
textualEncoder a
a)

instance (IsScalar a) => Read (ViaIsScalar a) where
  readsPrec :: Int -> ReadS (ViaIsScalar a)
readsPrec Int
d String
str =
    [ (a -> ViaIsScalar a
forall a. a -> ViaIsScalar a
ViaIsScalar a
a, String
rest)
    | (Text
txt, String
rest) <- Int -> ReadS Text
forall a. Read a => Int -> ReadS a
readsPrec Int
d String
str,
      let parsed :: Either String a
parsed = Parser a -> Text -> Either String a
forall a. Parser a -> Text -> Either String a
Attoparsec.parseOnly (forall a. IsScalar a => Parser a
textualDecoder @a Parser a -> Parser Text () -> Parser a
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
Attoparsec.endOfInput) Text
txt,
      Right a
a <- [Either String a
parsed]
    ]

instance (IsScalar a) => IsString (ViaIsScalar a) where
  fromString :: String -> ViaIsScalar a
fromString String
string =
    case Parser a -> Text -> Either String a
forall a. Parser a -> Text -> Either String a
Attoparsec.parseOnly (forall a. IsScalar a => Parser a
textualDecoder @a Parser a -> Parser Text () -> Parser a
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
Attoparsec.endOfInput) (String -> Text
Text.pack String
string) of
      Left String
err -> String -> ViaIsScalar a
forall a. HasCallStack => String -> a
error (String
"ViaIsScalar fromString: failed to parse: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
err)
      Right a
a -> a -> ViaIsScalar a
forall a. a -> ViaIsScalar a
ViaIsScalar a
a