{-# LANGUAGE FlexibleContexts #-}
{-|
Module : Database.HaskRel.Order
Description : Ordering functions
Copyright : © Thor Michael Støre, 2015
License : GPL v2 without "any later version" clause
Maintainer : thormichael át gmail døt com
Stability : experimental
Ordering functions. This is not of the relational model.
-}
module Database.HaskRel.Order (
-- * Ordering functions.
orderBy, orderOn,
Asc(Asc), Desc(Desc)
) where
import Data.Set ( Set, toList )
import qualified Data.Set
import Data.List ( sortOn, sortBy )
import Data.HList.CommonMain
-- import Database.HaskRel.Relational.TIP.Definition
-- import Data.Ord ( Down(Down) )
{- Converts a relation to an ordered set of r-tuples, ordered ascendingly. Because
Data.Set orders its elements (which is a no-no in relational theory and a
quality we must disregard in the context of it), and as such functions as an
ordered set, this will just rearrange the attributes.
ordRTupSet ::
(Ord (HList l), TagUntagFD a ta, TagUntagFD a1 l,
HProject (HList a) (HList a1)) =>
Relation' ta -> Relation' l -> Relation' l
ordRTupSet r _ = Data.Set.map hTIPRearrange r
TODO: This is TIP specific, figure out if this is neccessary or beneficial at all.
-}
{-| Takes any set (including that of a relation) and results in a list of the
elements it consists of ordered by the given predicate
-}
orderBy :: Set a -> (a -> a -> Ordering) -> [a]
orderBy r p = sortBy p $ toList r
{-| Takes any set (including that of a relation) and results in a list of the
elements it consists of ordered on the given key function
-}
orderOn :: Ord b => Set a -> (a -> b) -> [a]
orderOn r k = sortOn k $ toList r
newtype Asc a = Asc a deriving (Show, Read, Eq, Ord)
-- As with Data.Ord.Down
newtype Desc a = Desc a deriving (Show, Read, Eq)
instance Ord a => Ord (Desc a) where
compare (Desc x) (Desc y) = y `compare` x