{-# language GADTs #-}
{-# language NamedFieldPuns #-}
{-# language StandaloneKindSignatures #-}
module Rel8.Type.Information
( TypeInformation(..)
, mapTypeInformation
, parseTypeInformation
)
where
import Data.Bifunctor ( first )
import Data.Kind ( Type )
import Prelude
import qualified Hasql.Decoders as Hasql
import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
import qualified Data.Text as Text
type TypeInformation :: Type -> Type
data TypeInformation a = TypeInformation
{ forall a. TypeInformation a -> a -> PrimExpr
encode :: a -> Opaleye.PrimExpr
, forall a. TypeInformation a -> Value a
decode :: Hasql.Value a
, forall a. TypeInformation a -> String
typeName :: String
}
mapTypeInformation :: ()
=> (a -> b) -> (b -> a)
-> TypeInformation a -> TypeInformation b
mapTypeInformation :: forall a b.
(a -> b) -> (b -> a) -> TypeInformation a -> TypeInformation b
mapTypeInformation = forall a b.
(a -> Either String b)
-> (b -> a) -> TypeInformation a -> TypeInformation b
parseTypeInformation forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (f :: * -> *) a. Applicative f => a -> f a
pure
parseTypeInformation :: ()
=> (a -> Either String b) -> (b -> a)
-> TypeInformation a -> TypeInformation b
parseTypeInformation :: forall a b.
(a -> Either String b)
-> (b -> a) -> TypeInformation a -> TypeInformation b
parseTypeInformation a -> Either String b
to b -> a
from TypeInformation {a -> PrimExpr
encode :: a -> PrimExpr
encode :: forall a. TypeInformation a -> a -> PrimExpr
encode, Value a
decode :: Value a
decode :: forall a. TypeInformation a -> Value a
decode, String
typeName :: String
typeName :: forall a. TypeInformation a -> String
typeName} =
TypeInformation
{ encode :: b -> PrimExpr
encode = a -> PrimExpr
encode forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> a
from
, decode :: Value b
decode = forall a b. (a -> Either Text b) -> Value a -> Value b
Hasql.refine (forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first String -> Text
Text.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either String b
to) Value a
decode
, String
typeName :: String
typeName :: String
typeName
}