-- | Sorting utilities

{-# OPTIONS_HADDOCK hide #-}

module Blockfrost.Util.Sorting
  ( SortOrder (..)
  , Sorting
  , SortingExpanded
  , asc
  , desc
  ) where

import Data.Default.Class
import Servant.API (FromHttpApiData (..), QueryParam, ToHttpApiData (..), (:>))

data SortOrder = Ascending | Descending
  deriving (SortOrder -> SortOrder -> Bool
(SortOrder -> SortOrder -> Bool)
-> (SortOrder -> SortOrder -> Bool) -> Eq SortOrder
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SortOrder -> SortOrder -> Bool
$c/= :: SortOrder -> SortOrder -> Bool
== :: SortOrder -> SortOrder -> Bool
$c== :: SortOrder -> SortOrder -> Bool
Eq, Int -> SortOrder -> ShowS
[SortOrder] -> ShowS
SortOrder -> String
(Int -> SortOrder -> ShowS)
-> (SortOrder -> String)
-> ([SortOrder] -> ShowS)
-> Show SortOrder
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SortOrder] -> ShowS
$cshowList :: [SortOrder] -> ShowS
show :: SortOrder -> String
$cshow :: SortOrder -> String
showsPrec :: Int -> SortOrder -> ShowS
$cshowsPrec :: Int -> SortOrder -> ShowS
Show, Eq SortOrder
Eq SortOrder
-> (SortOrder -> SortOrder -> Ordering)
-> (SortOrder -> SortOrder -> Bool)
-> (SortOrder -> SortOrder -> Bool)
-> (SortOrder -> SortOrder -> Bool)
-> (SortOrder -> SortOrder -> Bool)
-> (SortOrder -> SortOrder -> SortOrder)
-> (SortOrder -> SortOrder -> SortOrder)
-> Ord SortOrder
SortOrder -> SortOrder -> Bool
SortOrder -> SortOrder -> Ordering
SortOrder -> SortOrder -> SortOrder
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SortOrder -> SortOrder -> SortOrder
$cmin :: SortOrder -> SortOrder -> SortOrder
max :: SortOrder -> SortOrder -> SortOrder
$cmax :: SortOrder -> SortOrder -> SortOrder
>= :: SortOrder -> SortOrder -> Bool
$c>= :: SortOrder -> SortOrder -> Bool
> :: SortOrder -> SortOrder -> Bool
$c> :: SortOrder -> SortOrder -> Bool
<= :: SortOrder -> SortOrder -> Bool
$c<= :: SortOrder -> SortOrder -> Bool
< :: SortOrder -> SortOrder -> Bool
$c< :: SortOrder -> SortOrder -> Bool
compare :: SortOrder -> SortOrder -> Ordering
$ccompare :: SortOrder -> SortOrder -> Ordering
$cp1Ord :: Eq SortOrder
Ord)

-- | @Ascending@ shortcut
asc :: SortOrder
asc :: SortOrder
asc = SortOrder
Ascending

-- | @Descending@ shortcut
desc :: SortOrder
desc :: SortOrder
desc = SortOrder
Descending

instance Default SortOrder where
  def :: SortOrder
def = SortOrder
Ascending

instance ToHttpApiData SortOrder where
  toUrlPiece :: SortOrder -> Text
toUrlPiece SortOrder
Ascending  = Text
"asc"
  toUrlPiece SortOrder
Descending = Text
"desc"

instance FromHttpApiData SortOrder where
  parseUrlPiece :: Text -> Either Text SortOrder
parseUrlPiece Text
"asc"  = SortOrder -> Either Text SortOrder
forall a b. b -> Either a b
Right SortOrder
Ascending
  parseUrlPiece Text
"desc" = SortOrder -> Either Text SortOrder
forall a b. b -> Either a b
Right SortOrder
Descending
  parseUrlPiece Text
z      = Text -> Either Text SortOrder
forall a b. a -> Either a b
Left (Text
"unknown SortOrder: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
z)

-- | Adds sorting to an API
data Sorting

-- | Adds sorting to an API
type SortingExpanded a =
  QueryParam "order" SortOrder
  :> a