{-# LANGUAGE Arrows #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE LambdaCase #-}
module Opaleye.Internal.Values where
import Opaleye.Internal.Column (Field_(Column))
import qualified Opaleye.Internal.Column as C
import qualified Opaleye.Column as OC
import qualified Opaleye.Internal.Tag as T
import qualified Opaleye.Internal.Operators as O
import qualified Opaleye.Internal.PrimQuery as PQ
import qualified Opaleye.Internal.PackMap as PM
import qualified Opaleye.Internal.QueryArr as Q
import qualified Opaleye.Internal.HaskellDB.PrimQuery as HPQ
import qualified Opaleye.Internal.PGTypes
import qualified Opaleye.SqlTypes
import Control.Arrow (returnA)
import qualified Control.Monad.Trans.State.Strict as State
import qualified Data.List.NonEmpty as NEL
import Data.Profunctor (Profunctor, dimap, rmap, lmap)
import Data.Profunctor.Product (ProductProfunctor)
import qualified Data.Profunctor.Product as PP
import Data.Profunctor.Product.Default (Default, def)
import Control.Applicative (liftA2)
nonEmptyValues :: Rowspec columns columns'
-> NEL.NonEmpty columns
-> Q.Select columns'
nonEmptyValues :: forall columns columns'.
Rowspec columns columns' -> NonEmpty columns -> Select columns'
nonEmptyValues Rowspec columns columns'
rowspec NonEmpty columns
rows =
let nerowspec' :: NonEmptyRowspec columns columns'
nerowspec' = case Rowspec columns columns'
rowspec of
NonEmptyRows NonEmptyRowspec columns columns'
nerowspec -> NonEmptyRowspec columns columns'
nerowspec
EmptyRows columns'
fields ->
(columns -> Field SqlInt4)
-> (Field SqlInt4 -> columns')
-> NonEmptyRowspec (Field SqlInt4) (Field SqlInt4)
-> NonEmptyRowspec columns columns'
forall a b c d.
(a -> b) -> (c -> d) -> NonEmptyRowspec b c -> NonEmptyRowspec a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap (Field SqlInt4 -> columns -> Field SqlInt4
forall a b. a -> b -> a
const Field SqlInt4
zero) (columns' -> Field SqlInt4 -> columns'
forall a b. a -> b -> a
const columns'
fields) NonEmptyRowspec (Field SqlInt4) (Field SqlInt4)
forall (n :: Nullability) a.
NonEmptyRowspec (Field_ n a) (Field_ n a)
nonEmptyRowspecField
where zero :: Field SqlInt4
zero = Field SqlInt4
0 :: C.Field Opaleye.SqlTypes.SqlInt4
in NonEmptyRowspec columns columns'
-> NonEmpty columns -> Select columns'
forall fields fields'.
NonEmptyRowspec fields fields' -> NonEmpty fields -> Select fields'
nonEmptyRows NonEmptyRowspec columns columns'
nerowspec' NonEmpty columns
rows
nonEmptyRows :: NonEmptyRowspec fields fields'
-> NEL.NonEmpty fields
-> Q.Select fields'
nonEmptyRows :: forall fields fields'.
NonEmptyRowspec fields fields' -> NonEmpty fields -> Select fields'
nonEmptyRows (NonEmptyRowspec fields -> NonEmpty PrimExpr
runRow State Tag (NonEmpty Symbol, fields')
fields) NonEmpty fields
rows =
State Tag (fields', PrimQuery) -> Query fields'
forall a. State Tag (a, PrimQuery) -> Query a
Q.productQueryArr (State Tag (fields', PrimQuery) -> Query fields')
-> State Tag (fields', PrimQuery) -> Query fields'
forall a b. (a -> b) -> a -> b
$ do
(NonEmpty Symbol
valuesPEs, fields'
newColumns) <- State Tag (NonEmpty Symbol, fields')
fields
(fields', PrimQuery) -> State Tag (fields', PrimQuery)
forall a. a -> StateT Tag Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (fields'
newColumns, [Symbol] -> NonEmpty [PrimExpr] -> PrimQuery
forall a. [Symbol] -> NonEmpty [PrimExpr] -> PrimQuery' a
PQ.Values (NonEmpty Symbol -> [Symbol]
forall a. NonEmpty a -> [a]
NEL.toList NonEmpty Symbol
valuesPEs) ((fields -> [PrimExpr]) -> NonEmpty fields -> NonEmpty [PrimExpr]
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (NonEmpty PrimExpr -> [PrimExpr]
forall a. NonEmpty a -> [a]
NEL.toList (NonEmpty PrimExpr -> [PrimExpr])
-> (fields -> NonEmpty PrimExpr) -> fields -> [PrimExpr]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. fields -> NonEmpty PrimExpr
runRow) NonEmpty fields
rows))
emptySelectExplicit :: Nullspec columns a -> Q.Select a
emptySelectExplicit :: forall columns a. Nullspec columns a -> Select a
emptySelectExplicit Nullspec columns a
nullspec = proc () -> do
SelectArr (Field SqlBool) ()
O.restrict -< Bool -> Field SqlBool
Opaleye.SqlTypes.sqlBool Bool
False
SelectArr a a
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< Nullspec columns a -> a
forall a fields. Nullspec a fields -> fields
nullFields Nullspec columns a
nullspec
data NonEmptyRowspec fields fields' =
NonEmptyRowspec (fields -> NEL.NonEmpty HPQ.PrimExpr)
(State.State T.Tag (NEL.NonEmpty HPQ.Symbol, fields'))
nonEmptyRowspecField :: NonEmptyRowspec (Field_ n a) (Field_ n a)
nonEmptyRowspecField :: forall (n :: Nullability) a.
NonEmptyRowspec (Field_ n a) (Field_ n a)
nonEmptyRowspecField = (Field_ n a -> PrimExpr)
-> (PrimExpr -> Field_ n a)
-> NonEmptyRowspec PrimExpr PrimExpr
-> NonEmptyRowspec (Field_ n a) (Field_ n a)
forall a b c d.
(a -> b) -> (c -> d) -> NonEmptyRowspec b c -> NonEmptyRowspec a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap Field_ n a -> PrimExpr
forall (n :: Nullability) a. Field_ n a -> PrimExpr
C.unColumn PrimExpr -> Field_ n a
forall (n :: Nullability) sqlType. PrimExpr -> Field_ n sqlType
C.Column (NonEmptyRowspec PrimExpr PrimExpr
-> NonEmptyRowspec (Field_ n a) (Field_ n a))
-> NonEmptyRowspec PrimExpr PrimExpr
-> NonEmptyRowspec (Field_ n a) (Field_ n a)
forall a b. (a -> b) -> a -> b
$ (PrimExpr -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, PrimExpr)
-> NonEmptyRowspec PrimExpr PrimExpr
forall fields fields'.
(fields -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, fields')
-> NonEmptyRowspec fields fields'
NonEmptyRowspec PrimExpr -> NonEmpty PrimExpr
forall a. a -> NonEmpty a
forall (f :: * -> *) a. Applicative f => a -> f a
pure State Tag (NonEmpty Symbol, PrimExpr)
s
where s :: State Tag (NonEmpty Symbol, PrimExpr)
s = do
Tag
t <- State Tag Tag
T.fresh
let symbol :: Symbol
symbol = String -> Tag -> Symbol
HPQ.Symbol String
"values" Tag
t
(NonEmpty Symbol, PrimExpr)
-> State Tag (NonEmpty Symbol, PrimExpr)
forall a. a -> StateT Tag Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Symbol -> NonEmpty Symbol
forall a. a -> NonEmpty a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Symbol
symbol, Symbol -> PrimExpr
HPQ.AttrExpr Symbol
symbol)
rowspecField :: Rowspec (Field_ n a) (Field_ n a)
rowspecField :: forall (n :: Nullability) a. Rowspec (Field_ n a) (Field_ n a)
rowspecField = NonEmptyRowspec (Field_ n a) (Field_ n a)
-> Rowspec (Field_ n a) (Field_ n a)
forall fields fields'.
NonEmptyRowspec fields fields' -> Rowspec fields fields'
NonEmptyRows NonEmptyRowspec (Field_ n a) (Field_ n a)
forall (n :: Nullability) a.
NonEmptyRowspec (Field_ n a) (Field_ n a)
nonEmptyRowspecField
data Rowspec fields fields' =
NonEmptyRows (NonEmptyRowspec fields fields')
| EmptyRows fields'
data Valuesspec fields fields' =
ValuesspecSafe (Nullspec fields fields')
(Rowspec fields fields')
valuesspecField :: Opaleye.SqlTypes.IsSqlType a
=> Valuesspec (Field_ n a) (Field_ n a)
valuesspecField :: forall a (n :: Nullability).
IsSqlType a =>
Valuesspec (Field_ n a) (Field_ n a)
valuesspecField = Valuesspec (Field_ n a) (Field_ n a)
forall {n :: Nullability}. Valuesspec (Field_ n a) (Field_ n a)
def_
where def_ :: Valuesspec (Field_ n a) (Field_ n a)
def_ = String -> Valuesspec (Field_ n a) (Field_ n a)
forall (n :: Nullability) a.
String -> Valuesspec (Field_ n a) (Field_ n a)
valuesspecFieldType (Maybe a -> String
forall sqlType (proxy :: * -> *).
IsSqlType sqlType =>
proxy sqlType -> String
forall (proxy :: * -> *). proxy a -> String
Opaleye.Internal.PGTypes.showSqlType Maybe a
sqlType)
sqlType :: Maybe a
sqlType = Valuesspec (Field_ n a) (Field_ n a) -> Maybe a
forall (f :: * -> *) (n :: Nullability) sqlType.
f (Field_ n sqlType) -> Maybe sqlType
columnProxy Valuesspec (Field_ n a) (Field_ n a)
def_
columnProxy :: f (Field_ n sqlType) -> Maybe sqlType
columnProxy :: forall (f :: * -> *) (n :: Nullability) sqlType.
f (Field_ n sqlType) -> Maybe sqlType
columnProxy f (Field_ n sqlType)
_ = Maybe sqlType
forall a. Maybe a
Nothing
valuesspecFieldType :: String -> Valuesspec (Field_ n a) (Field_ n a)
valuesspecFieldType :: forall (n :: Nullability) a.
String -> Valuesspec (Field_ n a) (Field_ n a)
valuesspecFieldType String
sqlType =
Nullspec (Field_ n a) (Field_ n a)
-> Rowspec (Field_ n a) (Field_ n a)
-> Valuesspec (Field_ n a) (Field_ n a)
forall fields fields'.
Nullspec fields fields'
-> Rowspec fields fields' -> Valuesspec fields fields'
ValuesspecSafe (String -> Nullspec (Field_ n a) (Field_ n a)
forall a (n :: Nullability) sqlType.
String -> Nullspec a (Field_ n sqlType)
nullspecFieldType String
sqlType) Rowspec (Field_ n a) (Field_ n a)
forall (n :: Nullability) a. Rowspec (Field_ n a) (Field_ n a)
rowspecField
instance forall a n. Opaleye.Internal.PGTypes.IsSqlType a
=> Default Valuesspec (Field_ n a) (Field_ n a) where
def :: Valuesspec (Field_ n a) (Field_ n a)
def = Nullspec (Field_ n a) (Field_ n a)
-> Rowspec (Field_ n a) (Field_ n a)
-> Valuesspec (Field_ n a) (Field_ n a)
forall fields fields'.
Nullspec fields fields'
-> Rowspec fields fields' -> Valuesspec fields fields'
ValuesspecSafe Nullspec (Field_ n a) (Field_ n a)
forall a (n :: Nullability) sqlType.
IsSqlType sqlType =>
Nullspec a (Field_ n sqlType)
nullspecField Rowspec (Field_ n a) (Field_ n a)
forall (n :: Nullability) a. Rowspec (Field_ n a) (Field_ n a)
rowspecField
newtype Nullspec fields fields' = Nullspec fields'
nullspecField :: forall a n sqlType.
Opaleye.SqlTypes.IsSqlType sqlType
=> Nullspec a (Field_ n sqlType)
nullspecField :: forall a (n :: Nullability) sqlType.
IsSqlType sqlType =>
Nullspec a (Field_ n sqlType)
nullspecField = String -> Nullspec a (Field_ n sqlType)
forall a (n :: Nullability) sqlType.
String -> Nullspec a (Field_ n sqlType)
nullspecFieldType String
ty
where ty :: String
ty = Maybe sqlType -> String
forall sqlType (proxy :: * -> *).
IsSqlType sqlType =>
proxy sqlType -> String
forall (proxy :: * -> *). proxy sqlType -> String
Opaleye.Internal.PGTypes.showSqlType (Maybe sqlType
forall a. Maybe a
Nothing :: Maybe sqlType)
nullspecFieldType :: String
-> Nullspec a (Field_ n sqlType)
nullspecFieldType :: forall a (n :: Nullability) sqlType.
String -> Nullspec a (Field_ n sqlType)
nullspecFieldType String
sqlType =
(Field_ n sqlType -> Nullspec a (Field_ n sqlType)
forall fields fields'. fields' -> Nullspec fields fields'
Nullspec
(Field_ n sqlType -> Nullspec a (Field_ n sqlType))
-> (Field_ 'Nullable Any -> Field_ n sqlType)
-> Field_ 'Nullable Any
-> Nullspec a (Field_ n sqlType)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Field_ n Any -> Field_ n sqlType
forall (n :: Nullability) a b. String -> Field_ n a -> Field_ n b
C.unsafeCast String
sqlType
(Field_ n Any -> Field_ n sqlType)
-> (Field_ 'Nullable Any -> Field_ n Any)
-> Field_ 'Nullable Any
-> Field_ n sqlType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ 'Nullable Any -> Field_ n Any
forall (n :: Nullability) a (n' :: Nullability) b.
Field_ n a -> Field_ n' b
C.unsafeCoerceColumn)
Column (Nullable Any)
Field_ 'Nullable Any
forall a. Column (Nullable a)
OC.null
nullspecList :: Nullspec a [b]
nullspecList :: forall a b. Nullspec a [b]
nullspecList = [b] -> Nullspec a [b]
forall a. a -> Nullspec a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
nullspecEitherLeft :: Nullspec a b
-> Nullspec a (Either b b')
nullspecEitherLeft :: forall a b b'. Nullspec a b -> Nullspec a (Either b b')
nullspecEitherLeft = (b -> Either b b') -> Nullspec a b -> Nullspec a (Either b b')
forall a b. (a -> b) -> Nullspec a a -> Nullspec a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b -> Either b b'
forall a b. a -> Either a b
Left
nullspecEitherRight :: Nullspec a b'
-> Nullspec a (Either b b')
nullspecEitherRight :: forall a b' b. Nullspec a b' -> Nullspec a (Either b b')
nullspecEitherRight = (b' -> Either b b') -> Nullspec a b' -> Nullspec a (Either b b')
forall a b. (a -> b) -> Nullspec a a -> Nullspec a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap b' -> Either b b'
forall a b. b -> Either a b
Right
instance Opaleye.SqlTypes.IsSqlType b
=> Default Nullspec a (Field_ n b) where
def :: Nullspec a (Field_ n b)
def = Nullspec a (Field_ n b)
forall a (n :: Nullability) sqlType.
IsSqlType sqlType =>
Nullspec a (Field_ n sqlType)
nullspecField
nullFields :: Nullspec a fields -> fields
nullFields :: forall a fields. Nullspec a fields -> fields
nullFields (Nullspec fields
v) = fields
v
instance Functor (ValuesspecUnsafe a) where
fmap :: forall a b.
(a -> b) -> ValuesspecUnsafe a a -> ValuesspecUnsafe a b
fmap a -> b
f (Valuesspec PackMap () PrimExpr () a
g) = PackMap () PrimExpr () b -> ValuesspecUnsafe a b
forall columns columns'.
PackMap () PrimExpr () columns'
-> ValuesspecUnsafe columns columns'
Valuesspec ((a -> b) -> PackMap () PrimExpr () a -> PackMap () PrimExpr () b
forall a b.
(a -> b) -> PackMap () PrimExpr () a -> PackMap () PrimExpr () b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f PackMap () PrimExpr () a
g)
instance Applicative (ValuesspecUnsafe a) where
pure :: forall a. a -> ValuesspecUnsafe a a
pure = PackMap () PrimExpr () a -> ValuesspecUnsafe a a
forall columns columns'.
PackMap () PrimExpr () columns'
-> ValuesspecUnsafe columns columns'
Valuesspec (PackMap () PrimExpr () a -> ValuesspecUnsafe a a)
-> (a -> PackMap () PrimExpr () a) -> a -> ValuesspecUnsafe a a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> PackMap () PrimExpr () a
forall a. a -> PackMap () PrimExpr () a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
Valuesspec PackMap () PrimExpr () (a -> b)
f <*> :: forall a b.
ValuesspecUnsafe a (a -> b)
-> ValuesspecUnsafe a a -> ValuesspecUnsafe a b
<*> Valuesspec PackMap () PrimExpr () a
x = PackMap () PrimExpr () b -> ValuesspecUnsafe a b
forall columns columns'.
PackMap () PrimExpr () columns'
-> ValuesspecUnsafe columns columns'
Valuesspec (PackMap () PrimExpr () (a -> b)
f PackMap () PrimExpr () (a -> b)
-> PackMap () PrimExpr () a -> PackMap () PrimExpr () b
forall a b.
PackMap () PrimExpr () (a -> b)
-> PackMap () PrimExpr () a -> PackMap () PrimExpr () b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> PackMap () PrimExpr () a
x)
instance Profunctor ValuesspecUnsafe where
dimap :: forall a b c d.
(a -> b)
-> (c -> d) -> ValuesspecUnsafe b c -> ValuesspecUnsafe a d
dimap a -> b
_ c -> d
g (Valuesspec PackMap () PrimExpr () c
q) = PackMap () PrimExpr () d -> ValuesspecUnsafe a d
forall columns columns'.
PackMap () PrimExpr () columns'
-> ValuesspecUnsafe columns columns'
Valuesspec ((c -> d) -> PackMap () PrimExpr () c -> PackMap () PrimExpr () d
forall b c a.
(b -> c) -> PackMap () PrimExpr a b -> PackMap () PrimExpr a c
forall (p :: * -> * -> *) b c a.
Profunctor p =>
(b -> c) -> p a b -> p a c
rmap c -> d
g PackMap () PrimExpr () c
q)
instance ProductProfunctor ValuesspecUnsafe where
purePP :: forall b a. b -> ValuesspecUnsafe a b
purePP = b -> ValuesspecUnsafe a b
forall a. a -> ValuesspecUnsafe a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
**** :: forall a a b.
ValuesspecUnsafe a (a -> b)
-> ValuesspecUnsafe a a -> ValuesspecUnsafe a b
(****) = ValuesspecUnsafe a (b -> c)
-> ValuesspecUnsafe a b -> ValuesspecUnsafe a c
forall a b.
ValuesspecUnsafe a (a -> b)
-> ValuesspecUnsafe a a -> ValuesspecUnsafe a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
instance Functor (Valuesspec a) where
fmap :: forall a b. (a -> b) -> Valuesspec a a -> Valuesspec a b
fmap a -> b
f (ValuesspecSafe Nullspec a a
g Rowspec a a
h) = Nullspec a b -> Rowspec a b -> Valuesspec a b
forall fields fields'.
Nullspec fields fields'
-> Rowspec fields fields' -> Valuesspec fields fields'
ValuesspecSafe ((a -> b) -> Nullspec a a -> Nullspec a b
forall a b. (a -> b) -> Nullspec a a -> Nullspec a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Nullspec a a
g) ((a -> b) -> Rowspec a a -> Rowspec a b
forall a b. (a -> b) -> Rowspec a a -> Rowspec a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Rowspec a a
h)
instance Applicative (Valuesspec a) where
pure :: forall a. a -> Valuesspec a a
pure a
a = Nullspec a a -> Rowspec a a -> Valuesspec a a
forall fields fields'.
Nullspec fields fields'
-> Rowspec fields fields' -> Valuesspec fields fields'
ValuesspecSafe (a -> Nullspec a a
forall a. a -> Nullspec a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a) (a -> Rowspec a a
forall a. a -> Rowspec a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a)
ValuesspecSafe Nullspec a (a -> b)
f Rowspec a (a -> b)
f' <*> :: forall a b.
Valuesspec a (a -> b) -> Valuesspec a a -> Valuesspec a b
<*> ValuesspecSafe Nullspec a a
x Rowspec a a
x' =
Nullspec a b -> Rowspec a b -> Valuesspec a b
forall fields fields'.
Nullspec fields fields'
-> Rowspec fields fields' -> Valuesspec fields fields'
ValuesspecSafe (Nullspec a (a -> b)
f Nullspec a (a -> b) -> Nullspec a a -> Nullspec a b
forall a b. Nullspec a (a -> b) -> Nullspec a a -> Nullspec a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Nullspec a a
x) (Rowspec a (a -> b)
f' Rowspec a (a -> b) -> Rowspec a a -> Rowspec a b
forall a b. Rowspec a (a -> b) -> Rowspec a a -> Rowspec a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Rowspec a a
x')
instance Profunctor Valuesspec where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> Valuesspec b c -> Valuesspec a d
dimap a -> b
f c -> d
g (ValuesspecSafe Nullspec b c
q Rowspec b c
q') = Nullspec a d -> Rowspec a d -> Valuesspec a d
forall fields fields'.
Nullspec fields fields'
-> Rowspec fields fields' -> Valuesspec fields fields'
ValuesspecSafe ((a -> b) -> (c -> d) -> Nullspec b c -> Nullspec a d
forall a b c d.
(a -> b) -> (c -> d) -> Nullspec b c -> Nullspec a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap a -> b
f c -> d
g Nullspec b c
q) ((a -> b) -> (c -> d) -> Rowspec b c -> Rowspec a d
forall a b c d. (a -> b) -> (c -> d) -> Rowspec b c -> Rowspec a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap a -> b
f c -> d
g Rowspec b c
q')
instance ProductProfunctor Valuesspec where
purePP :: forall b a. b -> Valuesspec a b
purePP = b -> Valuesspec a b
forall a. a -> Valuesspec a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
**** :: forall a a b.
Valuesspec a (a -> b) -> Valuesspec a a -> Valuesspec a b
(****) = Valuesspec a (b -> c) -> Valuesspec a b -> Valuesspec a c
forall a b.
Valuesspec a (a -> b) -> Valuesspec a a -> Valuesspec a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
instance Functor (Nullspec a) where
fmap :: forall a b. (a -> b) -> Nullspec a a -> Nullspec a b
fmap a -> b
f (Nullspec a
g) = b -> Nullspec a b
forall fields fields'. fields' -> Nullspec fields fields'
Nullspec (a -> b
f a
g)
instance Applicative (Nullspec a) where
pure :: forall a. a -> Nullspec a a
pure = a -> Nullspec a a
forall fields fields'. fields' -> Nullspec fields fields'
Nullspec
Nullspec a -> b
f <*> :: forall a b. Nullspec a (a -> b) -> Nullspec a a -> Nullspec a b
<*> Nullspec a
x = b -> Nullspec a b
forall fields fields'. fields' -> Nullspec fields fields'
Nullspec (a -> b
f a
x)
instance Profunctor Nullspec where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> Nullspec b c -> Nullspec a d
dimap a -> b
_ c -> d
g (Nullspec c
q) = d -> Nullspec a d
forall fields fields'. fields' -> Nullspec fields fields'
Nullspec (c -> d
g c
q)
instance ProductProfunctor Nullspec where
purePP :: forall b a. b -> Nullspec a b
purePP = b -> Nullspec a b
forall a. a -> Nullspec a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
**** :: forall a a b. Nullspec a (a -> b) -> Nullspec a a -> Nullspec a b
(****) = Nullspec a (b -> c) -> Nullspec a b -> Nullspec a c
forall a b. Nullspec a (a -> b) -> Nullspec a a -> Nullspec a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
instance Functor (NonEmptyRowspec a) where
fmap :: forall a b. (a -> b) -> NonEmptyRowspec a a -> NonEmptyRowspec a b
fmap = (a -> b) -> NonEmptyRowspec a a -> NonEmptyRowspec a b
forall b c a.
(b -> c) -> NonEmptyRowspec a b -> NonEmptyRowspec a c
forall (p :: * -> * -> *) b c a.
Profunctor p =>
(b -> c) -> p a b -> p a c
rmap
instance Profunctor NonEmptyRowspec where
dimap :: forall a b c d.
(a -> b) -> (c -> d) -> NonEmptyRowspec b c -> NonEmptyRowspec a d
dimap a -> b
f c -> d
g (NonEmptyRowspec b -> NonEmpty PrimExpr
a State Tag (NonEmpty Symbol, c)
b) =
(a -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, d) -> NonEmptyRowspec a d
forall fields fields'.
(fields -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, fields')
-> NonEmptyRowspec fields fields'
NonEmptyRowspec ((a -> b) -> (b -> NonEmpty PrimExpr) -> a -> NonEmpty PrimExpr
forall a b c. (a -> b) -> (b -> c) -> a -> c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap a -> b
f b -> NonEmpty PrimExpr
a) ((((NonEmpty Symbol, c) -> (NonEmpty Symbol, d))
-> State Tag (NonEmpty Symbol, c) -> State Tag (NonEmpty Symbol, d)
forall a b.
(a -> b) -> StateT Tag Identity a -> StateT Tag Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((NonEmpty Symbol, c) -> (NonEmpty Symbol, d))
-> State Tag (NonEmpty Symbol, c)
-> State Tag (NonEmpty Symbol, d))
-> ((c -> d) -> (NonEmpty Symbol, c) -> (NonEmpty Symbol, d))
-> (c -> d)
-> State Tag (NonEmpty Symbol, c)
-> State Tag (NonEmpty Symbol, d)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (c -> d) -> (NonEmpty Symbol, c) -> (NonEmpty Symbol, d)
forall a b.
(a -> b) -> (NonEmpty Symbol, a) -> (NonEmpty Symbol, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) c -> d
g State Tag (NonEmpty Symbol, c)
b)
instance Functor (Rowspec a) where
fmap :: forall a b. (a -> b) -> Rowspec a a -> Rowspec a b
fmap = (a -> b) -> Rowspec a a -> Rowspec a b
forall b c a. (b -> c) -> Rowspec a b -> Rowspec a c
forall (p :: * -> * -> *) b c a.
Profunctor p =>
(b -> c) -> p a b -> p a c
rmap
instance Applicative (Rowspec a) where
pure :: forall a. a -> Rowspec a a
pure a
x = a -> Rowspec a a
forall a a. a -> Rowspec a a
EmptyRows a
x
Rowspec a (a -> b)
r1 <*> :: forall a b. Rowspec a (a -> b) -> Rowspec a a -> Rowspec a b
<*> Rowspec a a
r2 = case (Rowspec a (a -> b)
r1, Rowspec a a
r2) of
(EmptyRows a -> b
f, EmptyRows a
x) -> b -> Rowspec a b
forall a a. a -> Rowspec a a
EmptyRows (a -> b
f a
x)
(EmptyRows a -> b
f, NonEmptyRows (NonEmptyRowspec a -> NonEmpty PrimExpr
x1 State Tag (NonEmpty Symbol, a)
x2)) ->
NonEmptyRowspec a b -> Rowspec a b
forall fields fields'.
NonEmptyRowspec fields fields' -> Rowspec fields fields'
NonEmptyRows ((a -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, b) -> NonEmptyRowspec a b
forall fields fields'.
(fields -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, fields')
-> NonEmptyRowspec fields fields'
NonEmptyRowspec a -> NonEmpty PrimExpr
x1 ((((NonEmpty Symbol, a) -> (NonEmpty Symbol, b))
-> State Tag (NonEmpty Symbol, a) -> State Tag (NonEmpty Symbol, b)
forall a b.
(a -> b) -> StateT Tag Identity a -> StateT Tag Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((NonEmpty Symbol, a) -> (NonEmpty Symbol, b))
-> State Tag (NonEmpty Symbol, a)
-> State Tag (NonEmpty Symbol, b))
-> ((a -> b) -> (NonEmpty Symbol, a) -> (NonEmpty Symbol, b))
-> (a -> b)
-> State Tag (NonEmpty Symbol, a)
-> State Tag (NonEmpty Symbol, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b) -> (NonEmpty Symbol, a) -> (NonEmpty Symbol, b)
forall a b.
(a -> b) -> (NonEmpty Symbol, a) -> (NonEmpty Symbol, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) a -> b
f State Tag (NonEmpty Symbol, a)
x2))
(NonEmptyRows (NonEmptyRowspec a -> NonEmpty PrimExpr
f1 State Tag (NonEmpty Symbol, a -> b)
f2), EmptyRows a
x) ->
NonEmptyRowspec a b -> Rowspec a b
forall fields fields'.
NonEmptyRowspec fields fields' -> Rowspec fields fields'
NonEmptyRows ((a -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, b) -> NonEmptyRowspec a b
forall fields fields'.
(fields -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, fields')
-> NonEmptyRowspec fields fields'
NonEmptyRowspec a -> NonEmpty PrimExpr
f1 ((((NonEmpty Symbol, a -> b) -> (NonEmpty Symbol, b))
-> State Tag (NonEmpty Symbol, a -> b)
-> State Tag (NonEmpty Symbol, b)
forall a b.
(a -> b) -> StateT Tag Identity a -> StateT Tag Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((NonEmpty Symbol, a -> b) -> (NonEmpty Symbol, b))
-> State Tag (NonEmpty Symbol, a -> b)
-> State Tag (NonEmpty Symbol, b))
-> (((a -> b) -> b)
-> (NonEmpty Symbol, a -> b) -> (NonEmpty Symbol, b))
-> ((a -> b) -> b)
-> State Tag (NonEmpty Symbol, a -> b)
-> State Tag (NonEmpty Symbol, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a -> b) -> b)
-> (NonEmpty Symbol, a -> b) -> (NonEmpty Symbol, b)
forall a b.
(a -> b) -> (NonEmpty Symbol, a) -> (NonEmpty Symbol, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) ((a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ a
x) State Tag (NonEmpty Symbol, a -> b)
f2))
(NonEmptyRows (NonEmptyRowspec a -> NonEmpty PrimExpr
f1 State Tag (NonEmpty Symbol, a -> b)
f2),
NonEmptyRows (NonEmptyRowspec a -> NonEmpty PrimExpr
x1 State Tag (NonEmpty Symbol, a)
x2)) ->
NonEmptyRowspec a b -> Rowspec a b
forall fields fields'.
NonEmptyRowspec fields fields' -> Rowspec fields fields'
NonEmptyRows ((a -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, b) -> NonEmptyRowspec a b
forall fields fields'.
(fields -> NonEmpty PrimExpr)
-> State Tag (NonEmpty Symbol, fields')
-> NonEmptyRowspec fields fields'
NonEmptyRowspec
(a -> NonEmpty PrimExpr
f1 (a -> NonEmpty PrimExpr)
-> (a -> NonEmpty PrimExpr) -> a -> NonEmpty PrimExpr
forall a. Semigroup a => a -> a -> a
<> a -> NonEmpty PrimExpr
x1)
((((NonEmpty Symbol, a -> b)
-> (NonEmpty Symbol, a) -> (NonEmpty Symbol, b))
-> State Tag (NonEmpty Symbol, a -> b)
-> State Tag (NonEmpty Symbol, a)
-> State Tag (NonEmpty Symbol, b)
forall a b c.
(a -> b -> c)
-> StateT Tag Identity a
-> StateT Tag Identity b
-> StateT Tag Identity c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (((NonEmpty Symbol, a -> b)
-> (NonEmpty Symbol, a) -> (NonEmpty Symbol, b))
-> State Tag (NonEmpty Symbol, a -> b)
-> State Tag (NonEmpty Symbol, a)
-> State Tag (NonEmpty Symbol, b))
-> (((a -> b) -> a -> b)
-> (NonEmpty Symbol, a -> b)
-> (NonEmpty Symbol, a)
-> (NonEmpty Symbol, b))
-> ((a -> b) -> a -> b)
-> State Tag (NonEmpty Symbol, a -> b)
-> State Tag (NonEmpty Symbol, a)
-> State Tag (NonEmpty Symbol, b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((a -> b) -> a -> b)
-> (NonEmpty Symbol, a -> b)
-> (NonEmpty Symbol, a)
-> (NonEmpty Symbol, b)
forall m a' b c.
Semigroup m =>
(a' -> b -> c) -> (m, a') -> (m, b) -> (m, c)
liftF2) (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
($) State Tag (NonEmpty Symbol, a -> b)
f2 State Tag (NonEmpty Symbol, a)
x2))
where
liftF2 :: Semigroup m
=> (a' -> b -> c) -> (m, a') -> (m, b) -> (m, c)
liftF2 :: forall m a' b c.
Semigroup m =>
(a' -> b -> c) -> (m, a') -> (m, b) -> (m, c)
liftF2 a' -> b -> c
f (m
ys1, a'
x1) (m
ys2, b
x2) = (m
ys1 m -> m -> m
forall a. Semigroup a => a -> a -> a
<> m
ys2, a' -> b -> c
f a'
x1 b
x2)
instance Profunctor Rowspec where
dimap :: forall a b c d. (a -> b) -> (c -> d) -> Rowspec b c -> Rowspec a d
dimap a -> b
f c -> d
g = \case
EmptyRows c
x -> d -> Rowspec a d
forall a a. a -> Rowspec a a
EmptyRows (c -> d
g c
x)
NonEmptyRows NonEmptyRowspec b c
x -> NonEmptyRowspec a d -> Rowspec a d
forall fields fields'.
NonEmptyRowspec fields fields' -> Rowspec fields fields'
NonEmptyRows ((a -> b) -> (c -> d) -> NonEmptyRowspec b c -> NonEmptyRowspec a d
forall a b c d.
(a -> b) -> (c -> d) -> NonEmptyRowspec b c -> NonEmptyRowspec a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap a -> b
f c -> d
g NonEmptyRowspec b c
x)
instance ProductProfunctor Rowspec where
purePP :: forall b a. b -> Rowspec a b
purePP = b -> Rowspec a b
forall a. a -> Rowspec a a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
**** :: forall a a b. Rowspec a (a -> b) -> Rowspec a a -> Rowspec a b
(****) = Rowspec a (b -> c) -> Rowspec a b -> Rowspec a c
forall a b. Rowspec a (a -> b) -> Rowspec a a -> Rowspec a b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>)
newtype ValuesspecUnsafe columns columns' =
Valuesspec (PM.PackMap () HPQ.PrimExpr () columns')
instance Default ValuesspecUnsafe (Field_ n a) (Field_ n a) where
def :: ValuesspecUnsafe (Field_ n a) (Field_ n a)
def = PackMap () PrimExpr () (Field_ n a)
-> ValuesspecUnsafe (Field_ n a) (Field_ n a)
forall columns columns'.
PackMap () PrimExpr () columns'
-> ValuesspecUnsafe columns columns'
Valuesspec ((() -> ())
-> (PrimExpr -> Field_ n a) -> PackMap () PrimExpr () (Field_ n a)
forall s a b t. (s -> a) -> (b -> t) -> PackMap a b s t
PM.iso () -> ()
forall a. a -> a
id PrimExpr -> Field_ n a
forall (n :: Nullability) sqlType. PrimExpr -> Field_ n sqlType
Column)