keys (empty) → 0.1.0
raw patch · 4 files changed
+579/−0 lines, 4 filesdep +arraydep +basedep +comonad-transformerssetup-changed
Dependencies added: array, base, comonad-transformers, containers, semigroupoids, semigroups, transformers
Files
- Data/Key.hs +508/−0
- LICENSE +30/−0
- Setup.lhs +7/−0
- keys.cabal +34/−0
+ Data/Key.hs view
@@ -0,0 +1,508 @@+{-# LANGUAGE TypeFamilies #-}+module Data.Key (+ -- * Keys+ Key++ -- * Keyed functors+ , Keyed(..)+ , (<#$>) -- :: Keyed f => (Key f -> a -> b) -> f a -> f b+ , keyed -- :: Keyed f => f a -> f (Key f, a)+ , apWithKey++ -- * Indexing+ , Index(..)+ , (!)++ -- * Safe Lookup+ , Lookup(..)+ , lookupDefault++ -- * FoldableWithKey+ , FoldableWithKey(..)+ , foldrWithKey' -- :: FoldableWithKey t => (Key t -> a -> b -> b) -> b -> t a -> b+ , foldlWithKey' -- :: FoldableWithKey t => (b -> Key t -> a -> b) -> b -> t a -> b+ , foldrWithKeyM -- :: (FoldableWithKey t, Monad m) => (Key t -> a -> b -> m b) -> b -> t a -> m b+ , foldlWithKeyM -- :: (FoldableWithKey t, Monad m) => (b -> Key t -> a -> m b) -> b -> t a -> m b+ , traverseWithKey_ -- :: (FoldableWithKey t, Applicative f) => (Key t -> a -> f b) -> t a -> f ()+ , forWithKey_ -- :: (FoldableWithKey t, Applicative f) => t a -> (Key t -> a -> f b) -> f ()+ , mapWithKeyM_ -- :: (FoldableWithKey t, Monad m) => (Key t -> a -> m b) -> t a -> m ()+ , forWithKeyM_ -- :: (FoldableWithKey t, Monad m) => t a -> (Key t -> a -> m b) -> m ()+ , concatMapWithKey -- :: FoldableWithKey t => (Key t -> a -> [b]) -> t a -> [b]+ , anyWithKey -- :: FoldableWithKey t => (Key t -> a -> Bool) -> t a -> Bool+ , allWithKey -- :: FoldableWithKey t => (Key t -> a -> Bool) -> t a -> Bool+ , findWithKey -- :: FoldableWithKey t => (Key t -> a -> Bool) -> t a -> Maybe a++ -- * FoldableWithKey1+ , FoldableWithKey1(..)+ , traverseWithKey1_ -- :: (FoldableWithKey1 t, Apply f) => (Key t -> a -> f b) -> t a -> f ()+ , forWithKey1_ -- :: (FoldableWithKey1 t, Apply f) => t a -> (Key t -> a -> f b) -> f ()+ , foldMapWithKeyDefault1 -- :: (FoldableWithKey1, Monoid m) => (Key t -> a -> m) -> t a -> m++ -- * TraversableWithKey+ , TraversableWithKey(..)+ , forWithKey -- :: (TraversableWithKey t, Applicative f) => t a -> (Key t -> a -> f b) -> f (t b)+ , forWithKeyM -- :: (TraversableWithKey t, Monad m) => t a -> (Key t -> a -> m b) -> m (t b)+ , mapAccumWithKeyL -- :: TraversableWithKey t => (Key t -> a -> b -> (a, c)) -> t a -> (a, t c)+ , mapAccumWithKeyR -- :: TraversableWithKey t => (Key t -> a -> b -> (a, c)) -> t a -> (a, t c)+ , mapWithKeyDefault -- :: TraversableWithKey t => (Key t -> a -> b) -> t a -> t b+ , foldMapWithKeyDefault -- :: (TraversableWithKey t, Monoid m) => (Key t -> a -> m) -> t a -> m++ -- * TraverableWithKey1+ , TraversableWithKey1(..)+ , foldMapWithKey1Default -- :: (TraversableWithKey1 t, Semigroup m) => (Key t -> a -> m) -> t a -> m+ , module Data.Foldable+ , module Data.Traversable+ , module Data.Semigroup+ , module Data.Semigroup.Foldable+ , module Data.Semigroup.Traversable+ ) where++import Control.Applicative+import Control.Comonad.Trans.Traced+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Reader+import qualified Data.Array as Array+import Data.Array (Array)+-- import qualified Data.Array.IArray as IArray+-- import qualified Data.Array.Unboxed hiding (index)+-- import Data.Array.Unboxed (UArray)+import Data.Functor.Identity+import Data.Functor.Bind+import Data.Functor.Compose+import Data.Foldable+import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap+import Data.Ix hiding (index)+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Maybe (listToMaybe)+import Data.Monoid as Monoid+import Data.Semigroup+import Data.Semigroup.Foldable+import Data.Semigroup.Traversable+import Data.Sequence (Seq, ViewL(..), viewl)+import qualified Data.Sequence as Seq+import Data.Traversable+import Prelude hiding (lookup)++type family Key (f :: * -> *) ++-- * Keyed+class Functor f => Keyed f where+ mapWithKey :: (Key f -> a -> b) -> f a -> f b++infixl 4 <#$>++(<#$>) :: Keyed f => (Key f -> a -> b) -> f a -> f b+(<#$>) = mapWithKey+{-# INLINE (<#$>) #-}++keyed :: Keyed f => f a -> f (Key f, a)+keyed = mapWithKey (,)+{-# INLINE keyed #-}++apWithKey :: (Keyed f, Applicative f) => f (Key f -> a -> b) -> f a -> f b+apWithKey ff fa = mapWithKey (\k f -> f k) ff <*> fa+{-# INLINE apWithKey #-}++-- * Index++class Index f where+ index :: f a -> Key f -> a++(!) :: Index f => f a -> Key f -> a+(!) = index++-- * Lookup++class Lookup f where+ lookup :: Key f -> f a -> Maybe a++lookupDefault :: Index f => Key f -> f a -> Maybe a+lookupDefault k t = Just (index t k)++-- * FoldableWithKey++class Foldable t => FoldableWithKey t where+ toIndexedList :: t a -> [(Key t, a)]+ toIndexedList = foldrWithKey (\k v t -> (k,v):t) []++ foldMapWithKey :: Monoid m => (Key t -> a -> m) -> t a -> m+ foldMapWithKey f = foldrWithKey (\k v -> mappend (f k v)) mempty++ foldrWithKey :: (Key t -> a -> b -> b) -> b -> t a -> b+ foldrWithKey f z t = appEndo (foldMapWithKey (\k v -> Endo (f k v)) t) z++ foldlWithKey :: (b -> Key t -> a -> b) -> b -> t a -> b+ foldlWithKey f z t = appEndo (getDual (foldMapWithKey (\k a -> Dual (Endo (\b -> f b k a))) t)) z++foldrWithKey' :: FoldableWithKey t => (Key t -> a -> b -> b) -> b -> t a -> b+foldrWithKey' f z0 xs = foldlWithKey f' id xs z0+ where f' k key x z = k $! f key x z+{-# INLINE foldrWithKey' #-}++foldlWithKey' :: FoldableWithKey t => (b -> Key t -> a -> b) -> b -> t a -> b+foldlWithKey' f z0 xs = foldrWithKey f' id xs z0+ where f' key x k z = k $! f z key x+{-# INLINE foldlWithKey' #-}++foldrWithKeyM :: (FoldableWithKey t, Monad m) => (Key t -> a -> b -> m b) -> b -> t a -> m b+foldrWithKeyM f z0 xs = foldlWithKey f' return xs z0+ where f' k key x z = f key x z >>= k+{-# INLINE foldrWithKeyM #-}++foldlWithKeyM :: (FoldableWithKey t, Monad m) => (b -> Key t -> a -> m b) -> b -> t a -> m b+foldlWithKeyM f z0 xs = foldrWithKey f' return xs z0+ where f' key x k z = f z key x >>= k+{-# INLINE foldlWithKeyM #-}++traverseWithKey_ :: (FoldableWithKey t, Applicative f) => (Key t -> a -> f b) -> t a -> f ()+traverseWithKey_ f = foldrWithKey (fmap (*>) . f) (pure ())+{-# INLINE traverseWithKey_ #-}++forWithKey_ :: (FoldableWithKey t, Applicative f) => t a -> (Key t -> a -> f b) -> f ()+forWithKey_ = flip traverseWithKey_+{-# INLINE forWithKey_ #-}++mapWithKeyM_ :: (FoldableWithKey t, Monad m) => (Key t -> a -> m b) -> t a -> m ()+mapWithKeyM_ f = foldrWithKey (fmap (>>) . f) (return ())+{-# INLINE mapWithKeyM_ #-}++forWithKeyM_ :: (FoldableWithKey t, Monad m) => t a -> (Key t -> a -> m b) -> m ()+forWithKeyM_ = flip mapWithKeyM_+{-# INLINE forWithKeyM_ #-}++concatMapWithKey :: FoldableWithKey t => (Key t -> a -> [b]) -> t a -> [b]+concatMapWithKey = foldMapWithKey+{-# INLINE concatMapWithKey #-}++anyWithKey :: FoldableWithKey t => (Key t -> a -> Bool) -> t a -> Bool+anyWithKey p = getAny . foldMapWithKey (fmap Any . p)+{-# INLINE anyWithKey #-}++allWithKey :: FoldableWithKey t => (Key t -> a -> Bool) -> t a -> Bool+allWithKey p = getAll . foldMapWithKey (fmap All . p)+{-# INLINE allWithKey #-}++findWithKey :: FoldableWithKey t => (Key t -> a -> Bool) -> t a -> Maybe a+findWithKey p = Monoid.getFirst . foldMapWithKey (\k x -> Monoid.First (if p k x then Just x else Nothing) )+{-# INLINE findWithKey #-}++-- * FoldableWithKey1++class (Foldable1 t, FoldableWithKey t) => FoldableWithKey1 t where+ foldMapWithKey1 :: Semigroup m => (Key t -> a -> m) -> t a -> m++newtype Act f a = Act { getAct :: f a }++instance Apply f => Semigroup (Act f a) where+ Act a <> Act b = Act (a .> b)++instance Functor f => Functor (Act f) where+ fmap f (Act a) = Act (f <$> a)+ b <$ Act a = Act (b <$ a)++traverseWithKey1_ :: (FoldableWithKey1 t, Apply f) => (Key t -> a -> f b) -> t a -> f ()+traverseWithKey1_ f = (<$) () . getAct . foldMapWithKey1 (fmap Act . f)+{-# INLINE traverseWithKey1_ #-}++forWithKey1_ :: (FoldableWithKey1 t, Apply f) => t a -> (Key t -> a -> f b) -> f ()+forWithKey1_ = flip traverseWithKey1_+{-# INLINE forWithKey1_ #-}++foldMapWithKeyDefault1 :: (FoldableWithKey1 t, Monoid m) => (Key t -> a -> m) -> t a -> m+foldMapWithKeyDefault1 f = unwrapMonoid . foldMapWithKey (fmap WrapMonoid . f)+{-# INLINE foldMapWithKeyDefault1 #-}++-- * TraversableWithKey++class (Keyed t, FoldableWithKey t, Traversable t) => TraversableWithKey t where+ traverseWithKey :: Applicative f => (Key t -> a -> f b) -> t a -> f (t b)++ mapWithKeyM :: Monad m => (Key t -> a -> m b) -> t a -> m (t b)+ mapWithKeyM f = unwrapMonad . traverseWithKey (fmap WrapMonad . f) ++forWithKey :: (TraversableWithKey t, Applicative f) => t a -> (Key t -> a -> f b) -> f (t b)+forWithKey = flip traverseWithKey+{-# INLINE forWithKey #-}++forWithKeyM :: (TraversableWithKey t, Monad m) => t a -> (Key t -> a -> m b) -> m (t b)+forWithKeyM = flip mapWithKeyM+{-# INLINE forWithKeyM #-}+++-- left-to-right state transformer+newtype StateL s a = StateL { runStateL :: s -> (s, a) }++instance Functor (StateL s) where+ fmap f (StateL k) = StateL $ \ s ->+ let (s', v) = k s in (s', f v)++instance Applicative (StateL s) where+ pure x = StateL (\ s -> (s, x))+ StateL kf <*> StateL kv = StateL $ \ s ->+ let (s', f) = kf s+ (s'', v) = kv s'+ in (s'', f v)++-- |The 'mapAccumWithKeyL' function behaves like a combination of 'mapWithKey'+-- and 'foldlWithKey'; it applies a function to each element of a structure,+-- passing an accumulating parameter from left to right, and returning+-- a final value of this accumulator together with the new structure.+mapAccumWithKeyL :: TraversableWithKey t => (Key t -> a -> b -> (a, c)) -> a -> t b -> (a, t c)+mapAccumWithKeyL f s t = runStateL (traverseWithKey (\k b -> StateL (\a -> f k a b)) t) s+{-# INLINE mapAccumWithKeyL #-}++-- right-to-left state transformer+newtype StateR s a = StateR { runStateR :: s -> (s, a) }++instance Functor (StateR s) where+ fmap f (StateR k) = StateR $ \ s ->+ let (s', v) = k s in (s', f v)++instance Applicative (StateR s) where+ pure x = StateR (\ s -> (s, x))+ StateR kf <*> StateR kv = StateR $ \ s ->+ let (s', v) = kv s+ (s'', f) = kf s'+ in (s'', f v)++-- |The 'mapAccumWithKeyR' function behaves like a combination of 'mapWithKey'+-- and 'foldrWithKey'; it applies a function to each element of a structure,+-- passing an accumulating parameter from right to left, and returning+-- a final value of this accumulator together with the new structure.+mapAccumWithKeyR :: TraversableWithKey t => (Key t -> a -> b -> (a, c)) -> a -> t b -> (a, t c)+mapAccumWithKeyR f s t = runStateR (traverseWithKey (\k b -> StateR (\a -> f k a b)) t) s+{-# INLINE mapAccumWithKeyR #-}++mapWithKeyDefault :: TraversableWithKey t => (Key t -> a -> b) -> t a -> t b+mapWithKeyDefault f = runIdentity . traverseWithKey (fmap Identity . f)+{-# INLINE mapWithKeyDefault #-}++-- | This function may be used as a value for `Data.Foldable.foldMapWithKey`+-- in a `FoldableWithKey` instance.+foldMapWithKeyDefault :: (TraversableWithKey t, Monoid m) => (Key t -> a -> m) -> t a -> m+foldMapWithKeyDefault f = getConst . traverseWithKey (fmap Const . f)+{-# INLINE foldMapWithKeyDefault #-}++-- * TraverableWithKey1+class (Traversable1 t, FoldableWithKey1 t, TraversableWithKey t) => TraversableWithKey1 t where+ traverseWithKey1 :: Apply f => (Key t -> a -> f b) -> t a -> f (t b)++foldMapWithKey1Default :: (TraversableWithKey1 t, Semigroup m) => (Key t -> a -> m) -> t a -> m+foldMapWithKey1Default f = getConst . traverseWithKey1 (\k -> Const . f k)+{-# INLINE foldMapWithKey1Default #-}++-- * Instances++type instance Key Identity = ()++instance Index Identity where+ index (Identity a) _ = a++instance Lookup Identity where+ lookup _ (Identity a) = Just a++instance Keyed Identity where+ mapWithKey f = Identity . f () . runIdentity++instance FoldableWithKey Identity where+ foldrWithKey f z (Identity a) = f () a z++instance FoldableWithKey1 Identity where+ foldMapWithKey1 f (Identity a) = f () a++instance TraversableWithKey Identity where+ traverseWithKey f (Identity a) = Identity <$> f () a++instance TraversableWithKey1 Identity where+ traverseWithKey1 f (Identity a) = Identity <$> f () a++type instance Key (IdentityT m) = Key m++instance Index m => Index (IdentityT m) where+ index (IdentityT m) i = index m i++instance Lookup m => Lookup (IdentityT m) where+ lookup i (IdentityT m) = lookup i m++instance Keyed m => Keyed (IdentityT m) where+ mapWithKey f = IdentityT . mapWithKey f . runIdentityT ++instance FoldableWithKey m => FoldableWithKey (IdentityT m) where+ foldrWithKey f z (IdentityT m) = foldrWithKey f z m++instance FoldableWithKey1 m => FoldableWithKey1 (IdentityT m) where+ foldMapWithKey1 f (IdentityT m) = foldMapWithKey1 f m++instance TraversableWithKey m => TraversableWithKey (IdentityT m) where+ traverseWithKey f (IdentityT a) = IdentityT <$> traverseWithKey f a++instance TraversableWithKey1 m => TraversableWithKey1 (IdentityT m) where+ traverseWithKey1 f (IdentityT a) = IdentityT <$> traverseWithKey1 f a++type instance Key ((->)a) = a++instance Keyed ((->)a) where+ mapWithKey = (<*>)++instance Index ((->)a) where+ index = id+ +instance Lookup ((->)a) where+ lookup i f = Just (f i)++type instance Key (ReaderT e m) = (e, Key m)++instance Keyed m => Keyed (ReaderT e m) where+ mapWithKey f (ReaderT m) = ReaderT $ \k -> mapWithKey (f . (,) k) (m k)++instance Index m => Index (ReaderT e m) where+ index (ReaderT f) (e,k) = index (f e) k++instance Lookup m => Lookup (ReaderT e m) where+ lookup (e,k) (ReaderT f) = lookup k (f e)++type instance Key (TracedT s w) = (s, Key w)++instance Keyed w => Keyed (TracedT s w) where+ mapWithKey f = TracedT . mapWithKey (\k' g k -> f (k, k') (g k)) . runTracedT ++instance Index w => Index (TracedT s w) where+ index (TracedT w) (e,k) = index w k e ++instance Lookup w => Lookup (TracedT s w) where+ lookup (e,k) (TracedT w) = ($ e) <$> lookup k w+ +type instance Key IntMap = Int++instance Keyed IntMap where+ mapWithKey = IntMap.mapWithKey++instance FoldableWithKey IntMap where+ foldrWithKey = IntMap.foldWithKey++instance TraversableWithKey IntMap where+ traverseWithKey f = fmap IntMap.fromDistinctAscList . traverse (\(k, v) -> (,) k <$> f k v) . IntMap.toAscList++instance Index IntMap where+ index = (IntMap.!)++instance Lookup IntMap where+ lookup = IntMap.lookup++type instance Key (Compose f g) = (Key f, Key g)++instance (Keyed f, Keyed g) => Keyed (Compose f g) where+ mapWithKey f = Compose . mapWithKey (\k -> mapWithKey (f . (,) k)) . getCompose++instance (Index f, Index g) => Index (Compose f g) where+ index (Compose fg) (i,j) = index (index fg i) j++instance (Lookup f, Lookup g) => Lookup (Compose f g) where+ lookup (i,j) (Compose fg) = lookup i fg >>= lookup j++instance (FoldableWithKey f, FoldableWithKey m) => FoldableWithKey (Compose f m) where+ foldMapWithKey f = foldMapWithKey (\k -> foldMapWithKey (f . (,) k)) . getCompose++instance (FoldableWithKey1 f, FoldableWithKey1 m) => FoldableWithKey1 (Compose f m) where+ foldMapWithKey1 f = foldMapWithKey1 (\k -> foldMapWithKey1 (f . (,) k)) . getCompose++instance (TraversableWithKey f, TraversableWithKey m) => TraversableWithKey (Compose f m) where+ traverseWithKey f = fmap Compose . traverseWithKey (\k -> traverseWithKey (f . (,) k)) . getCompose++instance (TraversableWithKey1 f, TraversableWithKey1 m) => TraversableWithKey1 (Compose f m) where+ traverseWithKey1 f = fmap Compose . traverseWithKey1 (\k -> traverseWithKey1 (f . (,) k)) . getCompose++type instance Key [] = Int++instance Keyed [] where+ mapWithKey f0 xs0 = go f0 xs0 0 where+ go _ [] _ = []+ go f (x:xs) n = f n x : (go f xs $! n)++instance FoldableWithKey [] where+ foldrWithKey f0 z0 xs0 = go f0 z0 xs0 0 where+ go _ z [] _ = z+ go f z (x:xs) n = f n x (go f z xs $! n)++instance TraversableWithKey [] where+ traverseWithKey f0 xs0 = go f0 xs0 0 where+ go _ [] _ = pure []+ go f (x:xs) n = (:) <$> f n x <*> (go f xs $! (n + 1))++instance Index [] where+ index = (!!)++instance Lookup [] where+ lookup = fmap listToMaybe . drop++type instance Key Seq = Int++instance Index Seq where+ index = Seq.index++instance Lookup Seq where+ lookup i s = case viewl (Seq.drop i s) of+ EmptyL -> Nothing+ a :< _ -> Just a++instance Keyed Seq where+ mapWithKey = Seq.mapWithIndex++instance FoldableWithKey Seq where+ foldrWithKey = Seq.foldrWithIndex++instance TraversableWithKey Seq where+ traverseWithKey f = fmap Seq.fromList . traverseWithKey f . toList++type instance Key (Map k) = k++instance Keyed (Map k) where+ mapWithKey = Map.mapWithKey++instance Ord k => Index (Map k) where+ index = (Map.!)++instance Ord k => Lookup (Map k) where+ lookup = Map.lookup++instance FoldableWithKey (Map k) where+ foldrWithKey = Map.foldrWithKey++instance TraversableWithKey (Map k) where+ traverseWithKey f = fmap Map.fromDistinctAscList . traverse (\(k, v) -> (,) k <$> f k v) . Map.toAscList++type instance Key (Array i) = i+ +instance Ix i => Keyed (Array i) where+ mapWithKey f arr = Array.listArray (Array.bounds arr) $ map (uncurry f) $ Array.assocs arr+ +instance Ix i => Index (Array i) where+ index = (Array.!)++instance Ix i => Lookup (Array i) where+ lookup i arr+ | inRange (Array.bounds arr) i = Just (arr Array.! i)+ | otherwise = Nothing++instance Ix i => FoldableWithKey (Array i) where+ foldrWithKey f z = Prelude.foldr (uncurry f) z . Array.assocs++instance Ix i => TraversableWithKey (Array i) where+ traverseWithKey f arr = Array.listArray (Array.bounds arr) <$> traverse (uncurry f) (Array.assocs arr)+ +{-+type instance Key (UArray i) = i++instance Ix i => Index (UArray i) where+ index = (IArray.!)++instance Ix i => Lookup (UArray i) where+ lookup i arr+ | inRange (IArray.bounds arr) i = Just (arr IArray.! i)+ | otherwise = Nothing++instance Ix i => FoldableWithKey (UArray i) where+ foldrWithKey f z = Prelude.foldr (uncurry f) z . IArray.assocs+-}
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright 2011 Edward Kmett++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.++3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
+ Setup.lhs view
@@ -0,0 +1,7 @@+#!/usr/bin/runhaskell+> module Main (main) where++> import Distribution.Simple++> main :: IO ()+> main = defaultMain
+ keys.cabal view
@@ -0,0 +1,34 @@+name: keys+category: Data Structures, Containers+version: 0.1.0+license: BSD3+cabal-version: >= 1.6+license-file: LICENSE+author: Edward A. Kmett+maintainer: Edward A. Kmett <ekmett@gmail.com>+stability: provisional+homepage: http://github.com/ekmett/keys/+copyright: Copyright (C) 2011 Edward A. Kmett+synopsis: Keyed functors and containers+description: Keyed functors and containers+build-type: Simple++source-repository head+ type: git+ location: git://github.com/ekmett/adjunctions.git++library+ build-depends: + array >= 0.3.0.2 && < 0.4,+ base >= 4 && < 4.4,+ comonad-transformers >= 1.5.0.3 && < 1.6,+ containers >= 0.4 && < 0.5,+ semigroups >= 0.3.4 && < 0.4,+ semigroupoids >= 1.1.1 && < 1.2,+ transformers >= 0.2.0 && < 0.3++ exposed-modules:+ Data.Key++ ghc-options: -Wall+