packages feed

postgresql-types-0.1: src/library/PostgresqlTypes/Via/IsScalar.hs

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 (Eq, Ord, Arbitrary, IsScalar)

instance (IsScalar a) => Show (ViaIsScalar a) where
  showsPrec d (ViaIsScalar a) = showsPrec d (textualEncoder a)

instance (IsScalar a) => Read (ViaIsScalar a) where
  readsPrec d str =
    [ (ViaIsScalar a, rest)
    | (txt, rest) <- readsPrec d str,
      let parsed = Attoparsec.parseOnly (textualDecoder @a <* Attoparsec.endOfInput) txt,
      Right a <- [parsed]
    ]

instance (IsScalar a) => IsString (ViaIsScalar a) where
  fromString string =
    case Attoparsec.parseOnly (textualDecoder @a <* Attoparsec.endOfInput) (Text.pack string) of
      Left err -> error ("ViaIsScalar fromString: failed to parse: " <> err)
      Right a -> ViaIsScalar a