{-# language DerivingStrategies #-}
{-# language GeneralizedNewtypeDeriving #-}
{-# language StandaloneKindSignatures #-}

module Rel8.Order
  ( Order(..)
  , toOrderExprs
  )
where

-- base
import Data.Functor.Contravariant ( Contravariant )
import Data.Kind ( Type )
import Prelude

-- contravariant
import Data.Functor.Contravariant.Divisible ( Decidable, Divisible )

-- opaleye
import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
import qualified Opaleye.Internal.Order as Opaleye


-- | An ordering expression for @a@. Primitive orderings are defined with
-- 'Rel8.asc' and 'Rel8.desc', and you can combine @Order@ via its various
-- instances.
--
-- A common pattern is to use '<>' to combine multiple orderings in sequence,
-- and 'Data.Functor.Contravariant.>$<' to select individual columns.
type Order :: Type -> Type
newtype Order a = Order (Opaleye.Order a)
  deriving newtype (b -> Order b -> Order a
(a -> b) -> Order b -> Order a
(forall a b. (a -> b) -> Order b -> Order a)
-> (forall b a. b -> Order b -> Order a) -> Contravariant Order
forall b a. b -> Order b -> Order a
forall a b. (a -> b) -> Order b -> Order a
forall (f :: * -> *).
(forall a b. (a -> b) -> f b -> f a)
-> (forall b a. b -> f b -> f a) -> Contravariant f
>$ :: b -> Order b -> Order a
$c>$ :: forall b a. b -> Order b -> Order a
contramap :: (a -> b) -> Order b -> Order a
$ccontramap :: forall a b. (a -> b) -> Order b -> Order a
Contravariant, Contravariant Order
Order a
Contravariant Order
-> (forall a b c. (a -> (b, c)) -> Order b -> Order c -> Order a)
-> (forall a. Order a)
-> Divisible Order
(a -> (b, c)) -> Order b -> Order c -> Order a
forall a. Order a
forall a b c. (a -> (b, c)) -> Order b -> Order c -> Order a
forall (f :: * -> *).
Contravariant f
-> (forall a b c. (a -> (b, c)) -> f b -> f c -> f a)
-> (forall a. f a)
-> Divisible f
conquer :: Order a
$cconquer :: forall a. Order a
divide :: (a -> (b, c)) -> Order b -> Order c -> Order a
$cdivide :: forall a b c. (a -> (b, c)) -> Order b -> Order c -> Order a
$cp1Divisible :: Contravariant Order
Divisible, Divisible Order
Divisible Order
-> (forall a. (a -> Void) -> Order a)
-> (forall a b c.
    (a -> Either b c) -> Order b -> Order c -> Order a)
-> Decidable Order
(a -> Void) -> Order a
(a -> Either b c) -> Order b -> Order c -> Order a
forall a. (a -> Void) -> Order a
forall a b c. (a -> Either b c) -> Order b -> Order c -> Order a
forall (f :: * -> *).
Divisible f
-> (forall a. (a -> Void) -> f a)
-> (forall a b c. (a -> Either b c) -> f b -> f c -> f a)
-> Decidable f
choose :: (a -> Either b c) -> Order b -> Order c -> Order a
$cchoose :: forall a b c. (a -> Either b c) -> Order b -> Order c -> Order a
lose :: (a -> Void) -> Order a
$close :: forall a. (a -> Void) -> Order a
$cp1Decidable :: Divisible Order
Decidable, b -> Order a -> Order a
NonEmpty (Order a) -> Order a
Order a -> Order a -> Order a
(Order a -> Order a -> Order a)
-> (NonEmpty (Order a) -> Order a)
-> (forall b. Integral b => b -> Order a -> Order a)
-> Semigroup (Order a)
forall b. Integral b => b -> Order a -> Order a
forall a. NonEmpty (Order a) -> Order a
forall a. Order a -> Order a -> Order a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b. Integral b => b -> Order a -> Order a
stimes :: b -> Order a -> Order a
$cstimes :: forall a b. Integral b => b -> Order a -> Order a
sconcat :: NonEmpty (Order a) -> Order a
$csconcat :: forall a. NonEmpty (Order a) -> Order a
<> :: Order a -> Order a -> Order a
$c<> :: forall a. Order a -> Order a -> Order a
Semigroup, Semigroup (Order a)
Order a
Semigroup (Order a)
-> Order a
-> (Order a -> Order a -> Order a)
-> ([Order a] -> Order a)
-> Monoid (Order a)
[Order a] -> Order a
Order a -> Order a -> Order a
forall a. Semigroup (Order a)
forall a. Order a
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. [Order a] -> Order a
forall a. Order a -> Order a -> Order a
mconcat :: [Order a] -> Order a
$cmconcat :: forall a. [Order a] -> Order a
mappend :: Order a -> Order a -> Order a
$cmappend :: forall a. Order a -> Order a -> Order a
mempty :: Order a
$cmempty :: forall a. Order a
$cp1Monoid :: forall a. Semigroup (Order a)
Monoid)


toOrderExprs :: Order a -> a -> [Opaleye.OrderExpr]
toOrderExprs :: Order a -> a -> [OrderExpr]
toOrderExprs (Order (Opaleye.Order a -> [(OrderOp, PrimExpr)]
order)) a
a =
  (OrderOp -> PrimExpr -> OrderExpr)
-> (OrderOp, PrimExpr) -> OrderExpr
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry OrderOp -> PrimExpr -> OrderExpr
Opaleye.OrderExpr ((OrderOp, PrimExpr) -> OrderExpr)
-> [(OrderOp, PrimExpr)] -> [OrderExpr]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> [(OrderOp, PrimExpr)]
order a
a