úÎSĖL<      !"#$%&'()*+,-./0123456789:;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 <. Fold the values in the <# using the given right-associative  binary operator  Fold the keys and values in the <# 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) @@+ 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  A. BSee IntMap% documentation for an explanation of B. dC<DE FGHIJKLMNO !"PQRSATUV#$%&'()*+,W@XYBZ[\]^_`abcdefghijklmnopqrstuRC<DE FGHIJKLMNO !"PQRSATUVv#$%&'()*+,XYB]^_`bdefgjm7C#<DE FGHIJKLMNO !"PQRSAVUT#$%&'()*+,W@XYBZ[\]^_`abcdefghijklmnopqrstuUses GHC extensionsStability : experimentalNonewxyz.<  !"#$%&'()*+,-!" #$%&'()*+, wxyzUses GHC extensionsStability : experimentalNone66 f s! is the set obtained by applying f to each element of s. It'>s worth noting that the size of the result may be smaller if,  for some (x,y), x /= y && f x == f y {-./0123456789:;|}~€‚ƒ„…†‡ˆ‰Š !"-./0123456789:;- !"./0123478965;:{-./0123456789:;|}~€‚ƒ„…†‡ˆ‰ŠUses GHC extensionsStability : experimentalNone‹ŒŽ.<  !"#$%&'()*+,-!" #$%&'()*+, ‹ŒŽ      !"#$$%%&'()*+,-./0     12345675689:;<=>?@ABCDEEFFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnefopqr[stuvwxyz{|}onefo~enummapmap-0.1.0Data.EnumMapMap.StrictData.EnumMapSetData.EnumMapMap.BaseData.EnumMapMap.Lazy emptySubTreesjoinKey unsafeJoinKeyemptynullsizemember singletonlookupinsert insertWith insertWithKeydeletealtermap mapWithKeyfoldr foldrWithKeytoListfromListunionunions unionWith unionWithKey differencedifferenceWithdifferenceWithKey intersectionintersectionWithintersectionWithKeysplitKeyK:&d1d2d3d4d5d6d7d8d9d10 EnumMapSet EnumMapMapbaseGHC.EnumEnumghc-prim GHC.TypesIntTruealter_EMM mergeWithKey'IsEmmemptySubTrees_ removeEmptiesequalnequalPlusIsSplitHeadTailNZMaskPrefixKeyNatNilTipBin insertWith_ mapWithKey_ foldrWithKey_equalEnequalE natFromInt intFromNatshiftRLshiftLLjoinjoinDbinbinDtipzeronomatchmatchmaskmaskWshorter branchMaskhighestBitMask foldlStrict$fNFDataEnumMapMap$fShowEnumMapMap$fMonoidEnumMapMap$fFunctorEnumMapMap$fEqEMM$fEqEnumMapMap $fIsEmm:& $fIsSplit:&NKCC $fIsSplit:&Z$fIsEmmKBitMapinsertBMdeleteBM suffixBitMask prefixBitMaskprefixOfsuffixOfbitmapOfSuffixbitmapOfbitcountindexOfTheOnlyBit lowestBitMaskrevNat foldrBits