{-| Module : Data.Ord.Ala Copyright : (C) 2013 Fumiaki Kinoshita License : BSD-style (see the file LICENSE) Maintainer : Fumiaki Kinsohita 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)