{-# language FlexibleContexts #-}
module Rel8.Query.Loop
( loop
, loopDistinct
) where
import Prelude
import Opaleye.With (withRecursiveExplicit, withRecursiveDistinctExplicit)
import Rel8.Expr ( Expr )
import Rel8.Query ( Query )
import Rel8.Query.Opaleye ( fromOpaleye, toOpaleye )
import Rel8.Table ( Table )
import Rel8.Table.Opaleye ( binaryspec )
loop :: Table Expr a => Query a -> (a -> Query a) -> Query a
loop :: forall a. Table Expr a => Query a -> (a -> Query a) -> Query a
loop Query a
base a -> Query a
recurse =
Select a -> Query a
forall a. Select a -> Query a
fromOpaleye (Select a -> Query a) -> Select a -> Query a
forall a b. (a -> b) -> a -> b
$ Binaryspec a a -> Select a -> (a -> Select a) -> Select a
forall a. Binaryspec a a -> Select a -> (a -> Select a) -> Select a
withRecursiveExplicit Binaryspec a a
forall a. Table Expr a => Binaryspec a a
binaryspec Select a
base' a -> Select a
recurse'
where
base' :: Select a
base' = Query a -> Select a
forall a. Query a -> Select a
toOpaleye Query a
base
recurse' :: a -> Select a
recurse' = Query a -> Select a
forall a. Query a -> Select a
toOpaleye (Query a -> Select a) -> (a -> Query a) -> a -> Select a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Query a
recurse
loopDistinct :: Table Expr a => Query a -> (a -> Query a) -> Query a
loopDistinct :: forall a. Table Expr a => Query a -> (a -> Query a) -> Query a
loopDistinct Query a
base a -> Query a
recurse =
Select a -> Query a
forall a. Select a -> Query a
fromOpaleye (Select a -> Query a) -> Select a -> Query a
forall a b. (a -> b) -> a -> b
$ Binaryspec a a -> Select a -> (a -> Select a) -> Select a
forall a. Binaryspec a a -> Select a -> (a -> Select a) -> Select a
withRecursiveDistinctExplicit Binaryspec a a
forall a. Table Expr a => Binaryspec a a
binaryspec Select a
base' a -> Select a
recurse'
where
base' :: Select a
base' = Query a -> Select a
forall a. Query a -> Select a
toOpaleye Query a
base
recurse' :: a -> Select a
recurse' = Query a -> Select a
forall a. Query a -> Select a
toOpaleye (Query a -> Select a) -> (a -> Query a) -> a -> Select a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Query a
recurse