module Opaleye.SQLite.Constant where
import Opaleye.SQLite.Column (Column)
import qualified Opaleye.SQLite.Column as C
import qualified Opaleye.SQLite.SqlTypes as T
import qualified Data.Text as ST
import qualified Data.Text.Lazy as LT
import qualified Data.Profunctor.Product as PP
import Data.Profunctor.Product (empty, (***!), (+++!))
import qualified Data.Profunctor.Product.Default as D
import qualified Data.Profunctor as P
import Control.Applicative (Applicative, pure, (<*>))
newtype Constant haskells columns =
Constant { constantExplicit :: haskells -> columns }
constant :: D.Default Constant haskells columns
=> haskells -> columns
constant = constantExplicit D.def
instance D.Default Constant haskell (Column sql)
=> D.Default Constant (Maybe haskell) (Column (C.Nullable sql)) where
def = Constant (C.maybeToNullable . fmap f)
where Constant f = D.def
instance D.Default Constant Int (Column T.SqlInt) where
def = Constant T.sqlInt
instance D.Default Constant String (Column T.SqlText) where
def = Constant T.sqlString
instance D.Default Constant ST.Text (Column T.SqlText) where
def = Constant T.sqlStrictText
instance D.Default Constant LT.Text (Column T.SqlText) where
def = Constant T.sqlLazyText
instance D.Default Constant Double (Column T.SqlReal) where
def = Constant T.sqlReal
instance D.Default Constant Bool (Column T.SqlBool) where
def = Constant T.sqlBool
instance Functor (Constant a) where
fmap f (Constant g) = Constant (fmap f g)
instance Applicative (Constant a) where
pure = Constant . pure
Constant f <*> Constant x = Constant (f <*> x)
instance P.Profunctor Constant where
dimap f g (Constant h) = Constant (P.dimap f g h)
instance PP.ProductProfunctor Constant where
empty = Constant empty
Constant f ***! Constant g = Constant (f ***! g)
instance PP.SumProfunctor Constant where
Constant f +++! Constant g = Constant (f +++! g)