module Data.Multimap.ListMultimap ( ListMultimap , cons, uncons ) where import Prelude hiding (map, uncons) import qualified Data.List as List import Data.Multimap.Internal (Multimap(..), lift1, liftF1) -- | A multimap with 'List' values. type ListMultimap k v = Multimap k [] v cons :: (Ord k) => k -> v -> ListMultimap k v -> ListMultimap k v cons k v = lift1 (v:) k uncons :: (Ord k, Ord v) => k -> ListMultimap k v -> Maybe (v, ListMultimap k v) uncons k = toMaybe . liftF1 (MaybeTuple . List.uncons) k newtype MaybeTuple a b = MaybeTuple { toMaybe :: Maybe (a,b) } instance Functor (MaybeTuple a) where fmap f (MaybeTuple Nothing) = MaybeTuple Nothing fmap f (MaybeTuple (Just (a,b))) = MaybeTuple $ Just (a, f b)