úÎJ[D½,      !"#$%&'()*+Uses GHC extensionsStability : experimentalNone%,'A map of keys to values. The keys are - types but are stored as .s  so any keys with the same ./ value are treated as the same. The aim is to  provide typesafe indexing. &No subtrees should be empty. Returns / if one is. Join a key so that an , of  , s becomes an ,.  # newtype ID = ID Int deriving Enum 4 emm :: EnumMapMap (K Int) (EnumMapMap (K ID) Bool) & res :: EnumMapMap (Int :& K ID) Bool  res = joinKey emm  is the opposite of . 6 emm = empty :: EnumMapMap (Int :& Int :& K ID) Bool) " emm == joinKey $ splitKey d2 emm Join a key so that an , of  , s becomes an ,%. The unsafe version does not check & for empty subtrees, so it is faster. # newtype ID = ID Int deriving Enum 4 emm :: EnumMapMap (K Int) (EnumMapMap (K ID) Bool) & res :: EnumMapMap (Int :& K ID) Bool  res = unsafeJoinKey emm  The empty ,. Is the , empty? FSubmaps can never be empty, so the following should always hold true: . emm :: EnumMapMap (Int :& Int :& K ID) Bool)  null $ splitKey x emm == False Number of elements in the ,. Is the key present in the ,? An , with one element 8 singleton (5 :& K 3) "a" == fromList [(5 :& K 3, "a")] $Lookup up the value at a key in the ,. " emm = fromList [(3 :& K 1, "a")] # lookup (3 :& K 1) emm == Just "a" " lookup (2 :& K 1) emm == Nothing Insert a new Key/Value pair into the ,. "Insert with a combining function. "Insert with a combining function. Remove a key and it's value from the ,. If the key is not  present the original , is returned. The expression (  f k emm) alters the value at k, or absence thereof.   8 can be used to insert, delete, or update a value in an ,. &Map a function over all values in the ,. Map a function over all key/value pairs in the ,. FFold the keys and values in the map using the given right-associative  binary operator.  Convert the , to a list of key/ value pairs.  Create a , from a list of key/ value pairs. The (left-biased) union of two ,s.  It prefers the first ,& when duplicate keys are encountered. The union of a list of maps. %The union with a combining function. %The union with a combining function. Difference between two ,s (based on keys). &Difference with a combining function. &Difference with a combining function. &The (left-biased) intersection of two , (based on keys). ,The intersection with a combining function. ,The intersection with a combining function. Split a key so that an , becomes an , of  ,s.  # newtype ID = ID Int deriving Enum . emm = empty :: EnumMapMap (Int :& K ID) Bool  res :: EnumMapMap (K ID) Bool & res = lookup (K 5) $ splitKey d1 emm FIf the level is too high then the compilation will fail with an error B emm = empty :: EnumMapMap (Int :& Int :& K Int) Bool -- 3 levels 8 res1 = splitKey d4 emm -- ERROR! Instance not found... 8 res2 = splitKey d3 emm -- ERROR! Instance not found...  res3 = splitKey d2 emm -- Good Keys are terminated with the  type  singleKey :: K Int  singleKey = K 5 !Multiple keys are joined by the ( ") constructor and terminated with . ! multiKey :: Int :& Int :& K Int  multiKey = 5 :& 6 :& K 5 "Split after 1 key. ( emm :: EnumMapMap (T1 :& T2 :& K T3) v B splitKey d1 emm :: EnumMapMap (T1 :& K T2) (EnumMapMap (K T3) v) #Split after 2 keys. ( emm :: EnumMapMap (T1 :& T2 :& K T3) v B splitKey d1 emm :: EnumMapMap (K T1) (EnumMapMap (T2 :& K T3) v) 00+ is used to walk down the tree to find the , to actually  change. If the new , is null then it's removed from the containing  1. 2See IntMap% documentation for an explanation of 2. b3,45 6789:;<=>? !@ABC1DEF"#$%&'()*+G0HI2JKLMNOPQRSTUVWXYZ[\]^_`abcdJ3,45 6789:;<=>? !B1DEFe"#$%&'()*+HI2OQSTUV\63",45 6789:;<=>? !@ABC1FED"#$%&'()*+G0HI2JKLMNOPQRSTUVWXYZ[\]^_`abcdUses GHC extensionsStability : experimentalNonefghi-,  !"#$%&'()*+, !"#$%&'()*+ fghiUses GHC extensionsStability : experimentalNonejklm-,  !"#$%&'()*+, !"#$%&'()*+ jklmn      !""##$%&'()*+,-./012342356789:;<=>?@ABBCCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijabkjabklenummapmap-0.0.2Data.EnumMapMap.StrictData.EnumMapMap.BaseData.EnumMapMap.Lazy emptySubTreesjoinKey unsafeJoinKeyemptynullsizemember singletonlookupinsert insertWith insertWithKeydeletealtermap mapWithKey foldrWithKeytoListfromListunionunions unionWith unionWithKey differencedifferenceWithdifferenceWithKey intersectionintersectionWithintersectionWithKeysplitKeyK:&d1d2d3d4d5d6d7d8d9d10 EnumMapMapbaseGHC.EnumEnumghc-prim GHC.TypesIntTruealter_EMM mergeWithKey'IsEmmemptySubTrees_ removeEmptiesequalnequalPlusIsSplitHeadTailNZMaskPrefixKeyNatNilTipBin insertWith_ mapWithKey_ foldrWithKey_equalEnequalE natFromInt intFromNatshiftRLjoinjoinDbinbinDtipzeronomatchmatchmaskmaskWshorter branchMaskhighestBitMask foldlStrict$fNFDataEnumMapMap$fShowEnumMapMap$fMonoidEnumMapMap$fFunctorEnumMapMap$fEqEMM$fEqEnumMapMap $fIsEmm:& $fIsSplit:&NKCC $fIsSplit:&Z$fIsEmmK