{-# language TupleSections #-}
module Rel8.Query.Opaleye
( fromOpaleye
, toOpaleye
, mapOpaleye
, zipOpaleyeWith
, unsafePeekQuery
)
where
import Control.Applicative ( liftA2 )
import Prelude
import qualified Opaleye.Internal.QueryArr as Opaleye
import qualified Opaleye.Internal.Tag as Opaleye
import {-# SOURCE #-} Rel8.Query ( Query( Query ) )
fromOpaleye :: Opaleye.Select a -> Query a
fromOpaleye :: forall a. Select a -> Query a
fromOpaleye = forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure 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
toOpaleye :: Query a -> Opaleye.Select a
toOpaleye :: forall a. Query a -> Select a
toOpaleye (Query [PrimExpr] -> Select (Any, a)
a) = forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PrimExpr] -> Select (Any, a)
a forall a. Monoid a => a
mempty
mapOpaleye :: (Opaleye.Select a -> Opaleye.Select b) -> Query a -> Query b
mapOpaleye :: forall a b. (Select a -> Select b) -> Query a -> Query b
mapOpaleye Select a -> Select b
f (Query [PrimExpr] -> Select (Any, a)
a) = forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b m.
(Select a -> Select b) -> Select (m, a) -> Select (m, b)
mapping Select a -> Select b
f) [PrimExpr] -> Select (Any, a)
a)
zipOpaleyeWith :: ()
=> (Opaleye.Select a -> Opaleye.Select b -> Opaleye.Select c)
-> Query a -> Query b -> Query c
zipOpaleyeWith :: forall a b c.
(Select a -> Select b -> Select c) -> Query a -> Query b -> Query c
zipOpaleyeWith Select a -> Select b -> Select c
f (Query [PrimExpr] -> Select (Any, a)
a) (Query [PrimExpr] -> Select (Any, b)
b) = forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (forall m a b c.
Semigroup m =>
(Select a -> Select b -> Select c)
-> Select (m, a) -> Select (m, b) -> Select (m, c)
zipping Select a -> Select b -> Select c
f) [PrimExpr] -> Select (Any, a)
a [PrimExpr] -> Select (Any, b)
b
unsafePeekQuery :: Query a -> a
unsafePeekQuery :: forall a. Query a -> a
unsafePeekQuery (Query [PrimExpr] -> Select (Any, a)
q) = case [PrimExpr] -> Select (Any, a)
q forall a. Monoid a => a
mempty of
Select (Any, a)
f -> case forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (Any, a)
f () Tag
Opaleye.start of
((Any
_, a
a), PrimQueryArr
_, Tag
_) -> a
a
mapping :: ()
=> (Opaleye.Select a -> Opaleye.Select b)
-> Opaleye.Select (m, a) -> Opaleye.Select (m, b)
mapping :: forall a b m.
(Select a -> Select b) -> Select (m, a) -> Select (m, b)
mapping Select a -> Select b
f Select (m, a)
q = forall a b. (a -> Tag -> (b, PrimQueryArr, Tag)) -> QueryArr a b
Opaleye.stateQueryArr forall a b. (a -> b) -> a -> b
$ \()
_ Tag
tag ->
let
((m
m, a
_), PrimQueryArr
_, Tag
_) = forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, a)
q () Tag
tag
q' :: QueryArr () (m, b)
q' = (m
m,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select a -> Select b
f (forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, a)
q)
in
forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr QueryArr () (m, b)
q' () Tag
tag
zipping :: Semigroup m
=> (Opaleye.Select a -> Opaleye.Select b -> Opaleye.Select c)
-> Opaleye.Select (m, a) -> Opaleye.Select (m, b) -> Opaleye.Select (m, c)
zipping :: forall m a b c.
Semigroup m =>
(Select a -> Select b -> Select c)
-> Select (m, a) -> Select (m, b) -> Select (m, c)
zipping Select a -> Select b -> Select c
f Select (m, a)
q Select (m, b)
q' =
forall a b. (a -> Tag -> (b, PrimQueryArr, Tag)) -> QueryArr a b
Opaleye.stateQueryArr forall a b. (a -> b) -> a -> b
$ \()
_ Tag
tag ->
let
((m
m, a
_), PrimQueryArr
_, Tag
_) = forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, a)
q () Tag
tag
((m
m', b
_), PrimQueryArr
_, Tag
_) = forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, b)
q' () Tag
tag
m'' :: m
m'' = m
m forall a. Semigroup a => a -> a -> a
<> m
m'
q'' :: QueryArr () (m, c)
q'' = (m
m'',) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select a -> Select b -> Select c
f (forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, a)
q) (forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, b)
q')
in
forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr QueryArr () (m, c)
q'' () Tag
tag