{-# LANGUAGE RoleAnnotations #-}{-# LANGUAGE TupleSections #-}{-# LANGUAGE DeriveDataTypeable #-}{-# LANGUAGE DeriveFunctor #-}{-# OPTIONS_GHC -Wall #-}-- Like 'UniqFM', these are maps for keys which are Uniquable.-- Unlike 'UniqFM', these maps also remember their keys, which-- makes them a much better drop in replacement for 'Data.Map.Map'.---- Key preservation is right-biased.moduleUniqMap(UniqMap ,emptyUniqMap ,isNullUniqMap ,unitUniqMap ,listToUniqMap ,listToUniqMap_C ,addToUniqMap ,addListToUniqMap ,addToUniqMap_C ,addToUniqMap_Acc ,alterUniqMap ,addListToUniqMap_C ,adjustUniqMap ,delFromUniqMap ,delListFromUniqMap ,plusUniqMap ,plusUniqMap_C ,plusMaybeUniqMap_C ,plusUniqMapList ,minusUniqMap ,intersectUniqMap ,disjointUniqMap ,mapUniqMap ,filterUniqMap ,partitionUniqMap ,sizeUniqMap ,elemUniqMap ,lookupUniqMap ,lookupWithDefaultUniqMap ,anyUniqMap ,allUniqMap ,-- Non-deterministic functions omitted)whereimportGhcPreludeimportUniqFMimportUniqueimportOutputableimportData.SemigroupasSemi(Semigroup(..))importData.CoerceimportData.MaybeimportData.Data-- | Maps indexed by 'Uniquable' keysnewtypeUniqMap k a =UniqMap (UniqFM(k ,a ))deriving(Data,Eq,Functor)typeroleUniqMapnominalrepresentationalinstanceSemigroup(UniqMap k a )where(<> )=plusUniqMap instanceMonoid(UniqMap k a )wheremempty =emptyUniqMap mappend =(Semi.<>)instance(Outputablek ,Outputablea )=>Outputable(UniqMap k a )whereppr (UniqMap m )=brackets$fsep$punctuatecomma$[pprk <+>text"->"<+>pprv |(k ,v )<-eltsUFMm ]liftC::(a ->a ->a )->(k ,a )->(k ,a )->(k ,a )liftC f (_,v )(k' ,v' )=(k' ,f v v' )emptyUniqMap::UniqMap k a emptyUniqMap =UniqMap emptyUFMisNullUniqMap::UniqMap k a ->BoolisNullUniqMap (UniqMap m )=isNullUFMm unitUniqMap::Uniquablek =>k ->a ->UniqMap k a unitUniqMap k v =UniqMap (unitUFMk (k ,v ))listToUniqMap::Uniquablek =>[(k ,a )]->UniqMap k a listToUniqMap kvs =UniqMap (listToUFM[(k ,(k ,v ))|(k ,v )<-kvs ])listToUniqMap_C::Uniquablek =>(a ->a ->a )->[(k ,a )]->UniqMap k a listToUniqMap_C f kvs =UniqMap $listToUFM_C(liftC f )[(k ,(k ,v ))|(k ,v )<-kvs ]addToUniqMap::Uniquablek =>UniqMap k a ->k ->a ->UniqMap k a addToUniqMap (UniqMap m )k v =UniqMap $addToUFMm k (k ,v )addListToUniqMap::Uniquablek =>UniqMap k a ->[(k ,a )]->UniqMap k a addListToUniqMap (UniqMap m )kvs =UniqMap $addListToUFMm [(k ,(k ,v ))|(k ,v )<-kvs ]addToUniqMap_C::Uniquablek =>(a ->a ->a )->UniqMap k a ->k ->a ->UniqMap k a addToUniqMap_C f (UniqMap m )k v =UniqMap $addToUFM_C(liftC f )m k (k ,v )addToUniqMap_Acc::Uniquablek =>(b ->a ->a )->(b ->a )->UniqMap k a ->k ->b ->UniqMap k a addToUniqMap_Acc exi new (UniqMap m )k0 v0 =UniqMap $addToUFM_Acc(\b (k ,v )->(k ,exi b v ))(\b ->(k0 ,new b ))m k0 v0 alterUniqMap::Uniquablek =>(Maybea ->Maybea )->UniqMap k a ->k ->UniqMap k a alterUniqMap f (UniqMap m )k =UniqMap $alterUFM(fmap(k ,).f .fmapsnd)m k addListToUniqMap_C::Uniquablek =>(a ->a ->a )->UniqMap k a ->[(k ,a )]->UniqMap k a addListToUniqMap_C f (UniqMap m )kvs =UniqMap $addListToUFM_C(liftC f )m [(k ,(k ,v ))|(k ,v )<-kvs ]adjustUniqMap::Uniquablek =>(a ->a )->UniqMap k a ->k ->UniqMap k a adjustUniqMap f (UniqMap m )k =UniqMap $adjustUFM(\(_,v )->(k ,f v ))m k delFromUniqMap::Uniquablek =>UniqMap k a ->k ->UniqMap k a delFromUniqMap (UniqMap m )k =UniqMap $delFromUFMm k delListFromUniqMap::Uniquablek =>UniqMap k a ->[k ]->UniqMap k a delListFromUniqMap (UniqMap m )ks =UniqMap $delListFromUFMm ks plusUniqMap::UniqMap k a ->UniqMap k a ->UniqMap k a plusUniqMap (UniqMap m1 )(UniqMap m2 )=UniqMap $plusUFMm1 m2 plusUniqMap_C::(a ->a ->a )->UniqMap k a ->UniqMap k a ->UniqMap k a plusUniqMap_C f (UniqMap m1 )(UniqMap m2 )=UniqMap $plusUFM_C(liftC f )m1 m2 plusMaybeUniqMap_C::(a ->a ->Maybea )->UniqMap k a ->UniqMap k a ->UniqMap k a plusMaybeUniqMap_C f (UniqMap m1 )(UniqMap m2 )=UniqMap $plusMaybeUFM_C(\(_,v )(k' ,v' )->fmap(k' ,)(f v v' ))m1 m2 plusUniqMapList::[UniqMap k a ]->UniqMap k a plusUniqMapList xs =UniqMap $plusUFMList(coercexs )minusUniqMap::UniqMap k a ->UniqMap k b ->UniqMap k a minusUniqMap (UniqMap m1 )(UniqMap m2 )=UniqMap $minusUFMm1 m2 intersectUniqMap::UniqMap k a ->UniqMap k b ->UniqMap k a intersectUniqMap (UniqMap m1 )(UniqMap m2 )=UniqMap $intersectUFMm1 m2 disjointUniqMap::UniqMap k a ->UniqMap k b ->BooldisjointUniqMap (UniqMap m1 )(UniqMap m2 )=disjointUFMm1 m2 mapUniqMap::(a ->b )->UniqMap k a ->UniqMap k b mapUniqMap f (UniqMap m )=UniqMap $mapUFM(fmapf )m -- (,) k instancefilterUniqMap::(a ->Bool)->UniqMap k a ->UniqMap k a filterUniqMap f (UniqMap m )=UniqMap $filterUFM(f .snd)m partitionUniqMap::(a ->Bool)->UniqMap k a ->(UniqMap k a ,UniqMap k a )partitionUniqMap f (UniqMap m )=coerce$partitionUFM(f .snd)m sizeUniqMap::UniqMap k a ->IntsizeUniqMap (UniqMap m )=sizeUFMm elemUniqMap::Uniquablek =>k ->UniqMap k a ->BoolelemUniqMap k (UniqMap m )=elemUFMk m lookupUniqMap::Uniquablek =>UniqMap k a ->k ->Maybea lookupUniqMap (UniqMap m )k =fmapsnd(lookupUFMm k )lookupWithDefaultUniqMap::Uniquablek =>UniqMap k a ->a ->k ->a lookupWithDefaultUniqMap (UniqMap m )a k =fromMaybea (fmapsnd(lookupUFMm k ))anyUniqMap::(a ->Bool)->UniqMap k a ->BoolanyUniqMap f (UniqMap m )=anyUFM(f .snd)m allUniqMap::(a ->Bool)->UniqMap k a ->BoolallUniqMap f (UniqMap m )=allUFM(f .snd)m 

AltStyle によって変換されたページ (->オリジナル) /