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

module Rel8.Order
  ( Order(..)
  )
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.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 (forall b a. b -> Order b -> Order a
forall a' a. (a' -> a) -> Order a -> Order a'
forall (f :: * -> *).
(forall a' a. (a' -> a) -> f a -> f a')
-> (forall b a. b -> f b -> f a) -> Contravariant f
>$ :: forall b a. b -> Order b -> Order a
$c>$ :: forall b a. b -> Order b -> Order a
contramap :: forall a' a. (a' -> a) -> Order a -> Order a'
$ccontramap :: forall a' a. (a' -> a) -> Order a -> Order a'
Contravariant, Contravariant Order
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 :: forall a. Order a
$cconquer :: forall a. Order a
divide :: forall a b c. (a -> (b, c)) -> Order b -> Order c -> Order a
$cdivide :: forall a b c. (a -> (b, c)) -> Order b -> Order c -> Order a
Divisible, Divisible Order
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 :: forall a b c. (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 :: forall a. (a -> Void) -> Order a
$close :: forall a. (a -> Void) -> Order a
Decidable, NonEmpty (Order a) -> Order a
Order a -> Order a -> 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 :: forall b. Integral b => 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, 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
Monoid)