packages feed

postgresql-types-0.1.5.0: src/library/PostgresqlTypes/Via/IsPrimitive.hs

module PostgresqlTypes.Via.IsPrimitive where

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

newtype ViaIsPrimitive a = ViaIsPrimitive a
  deriving newtype (Eq, Ord, Arbitrary, IsPrimitive)

instance (IsPrimitive a) => Show (ViaIsPrimitive a) where
  showsPrec d (ViaIsPrimitive a) = showsPrec d (textualEncoder a)

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

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