ord-adhoc-0.0.0.1: Data/Ord/Ala.hs
{-|
Module : Data.Ord.Ala
Copyright : (C) 2013 Fumiaki Kinoshita
License : BSD-style (see the file LICENSE)
Maintainer : Fumiaki Kinsohita <fumiexcel@gmail.com>
Creating Ord instance by a key function
-}
module Data.Ord.Ala (Ala(..), ordBy, unAla, keyAla, mapAla) where
-- | Also known as store comonad
newtype Ala k a = Ala (a -> k, a)
instance Eq k => Eq (Ala k a) where
a == b = keyAla a == keyAla b
instance Ord k => Ord (Ala k a) where
a `compare` b = keyAla a `compare` keyAla b
-- | Make 'Ord' instance from the key function.
ordBy :: Ord k => (a -> k) -> a -> Ala k a
ordBy f x = Ala (f, x)
-- | Extract the original value from 'Ala'.
unAla :: Ala k a -> a
unAla (Ala (_, x)) = x
-- | Extract the key from 'Ala'.
keyAla :: Ala k a -> k
keyAla (Ala (f, x)) = f x
mapAla :: (j -> k) -> Ala j a -> Ala k a
mapAla f (Ala (k, a)) = Ala (f . k, a)