<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ --> <title>Data/Map.hs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP #-}</span> <a name="line-2"></a><span class='hs-comment'>{-# OPTIONS_GHC -XNoBangPatterns #-}</span> <a name="line-3"></a> <a name="line-4"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span> <a name="line-5"></a><span class='hs-comment'>-- |</span> <a name="line-6"></a><span class='hs-comment'>-- Module : Data.Map</span> <a name="line-7"></a><span class='hs-comment'>-- Copyright : (c) Daan Leijen 2002</span> <a name="line-8"></a><span class='hs-comment'>-- (c) Andriy Palamarchuk 2008</span> <a name="line-9"></a><span class='hs-comment'>-- License : BSD-style</span> <a name="line-10"></a><span class='hs-comment'>-- Maintainer : libraries@haskell.org</span> <a name="line-11"></a><span class='hs-comment'>-- Stability : provisional</span> <a name="line-12"></a><span class='hs-comment'>-- Portability : portable</span> <a name="line-13"></a><span class='hs-comment'>--</span> <a name="line-14"></a><span class='hs-comment'>-- An efficient implementation of maps from keys to values (dictionaries).</span> <a name="line-15"></a><span class='hs-comment'>--</span> <a name="line-16"></a><span class='hs-comment'>-- Since many function names (but not the type name) clash with</span> <a name="line-17"></a><span class='hs-comment'>-- "Prelude" names, this module is usually imported @qualified@, e.g.</span> <a name="line-18"></a><span class='hs-comment'>--</span> <a name="line-19"></a><span class='hs-comment'>-- > import Data.Map (Map)</span> <a name="line-20"></a><span class='hs-comment'>-- > import qualified Data.Map as Map</span> <a name="line-21"></a><span class='hs-comment'>--</span> <a name="line-22"></a><span class='hs-comment'>-- The implementation of 'Map' is based on /size balanced/ binary trees (or</span> <a name="line-23"></a><span class='hs-comment'>-- trees of /bounded balance/) as described by:</span> <a name="line-24"></a><span class='hs-comment'>--</span> <a name="line-25"></a><span class='hs-comment'>-- * Stephen Adams, \"/Efficient sets: a balancing act/\",</span> <a name="line-26"></a><span class='hs-comment'>-- Journal of Functional Programming 3(4):553-562, October 1993,</span> <a name="line-27"></a><span class='hs-comment'>-- <<a href="http://www.swiss.ai.mit.edu/~adams/BB/">http://www.swiss.ai.mit.edu/~adams/BB/</a>>.</span> <a name="line-28"></a><span class='hs-comment'>--</span> <a name="line-29"></a><span class='hs-comment'>-- * J. Nievergelt and E.M. Reingold,</span> <a name="line-30"></a><span class='hs-comment'>-- \"/Binary search trees of bounded balance/\",</span> <a name="line-31"></a><span class='hs-comment'>-- SIAM journal of computing 2(1), March 1973.</span> <a name="line-32"></a><span class='hs-comment'>--</span> <a name="line-33"></a><span class='hs-comment'>-- Note that the implementation is /left-biased/ -- the elements of a</span> <a name="line-34"></a><span class='hs-comment'>-- first argument are always preferred to the second, for example in</span> <a name="line-35"></a><span class='hs-comment'>-- 'union' or 'insert'.</span> <a name="line-36"></a><span class='hs-comment'>--</span> <a name="line-37"></a><span class='hs-comment'>-- Operation comments contain the operation time complexity in</span> <a name="line-38"></a><span class='hs-comment'>-- the Big-O notation <<a href="http://en.wikipedia.org/wiki/Big_O_notation">http://en.wikipedia.org/wiki/Big_O_notation</a>>.</span> <a name="line-39"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span> <a name="line-40"></a> <a name="line-41"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-layout'>(</span> <a name="line-42"></a> <span class='hs-comment'>-- * Map type</span> <a name="line-43"></a><span class='hs-cpp'>#if !defined(TESTING)</span> <a name="line-44"></a> <span class='hs-conid'>Map</span> <span class='hs-comment'>-- instance Eq,Show,Read</span> <a name="line-45"></a><span class='hs-cpp'>#else</span> <a name="line-46"></a> <span class='hs-conid'>Map</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- instance Eq,Show,Read</span> <a name="line-47"></a><span class='hs-cpp'>#endif</span> <a name="line-48"></a> <a name="line-49"></a> <span class='hs-comment'>-- * Operators</span> <a name="line-50"></a> <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'>\\</span><span class='hs-layout'>)</span> <a name="line-51"></a> <a name="line-52"></a> <span class='hs-comment'>-- * Query</span> <a name="line-53"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>null</span> <a name="line-54"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>size</span> <a name="line-55"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>member</span> <a name="line-56"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>notMember</span> <a name="line-57"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>lookup</span> <a name="line-58"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>findWithDefault</span> <a name="line-59"></a> <a name="line-60"></a> <span class='hs-comment'>-- * Construction</span> <a name="line-61"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>empty</span> <a name="line-62"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>singleton</span> <a name="line-63"></a> <a name="line-64"></a> <span class='hs-comment'>-- ** Insertion</span> <a name="line-65"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>insert</span> <a name="line-66"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>insertWith</span> <a name="line-67"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>insertWith'</span> <a name="line-68"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>insertWithKey</span> <a name="line-69"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>insertWithKey'</span> <a name="line-70"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>insertLookupWithKey</span> <a name="line-71"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>insertLookupWithKey'</span> <a name="line-72"></a> <a name="line-73"></a> <span class='hs-comment'>-- ** Delete\/Update</span> <a name="line-74"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>delete</span> <a name="line-75"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>adjust</span> <a name="line-76"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>adjustWithKey</span> <a name="line-77"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>update</span> <a name="line-78"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>updateWithKey</span> <a name="line-79"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>updateLookupWithKey</span> <a name="line-80"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>alter</span> <a name="line-81"></a> <a name="line-82"></a> <span class='hs-comment'>-- * Combine</span> <a name="line-83"></a> <a name="line-84"></a> <span class='hs-comment'>-- ** Union</span> <a name="line-85"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>union</span> <a name="line-86"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>unionWith</span> <a name="line-87"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>unionWithKey</span> <a name="line-88"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>unions</span> <a name="line-89"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>unionsWith</span> <a name="line-90"></a> <a name="line-91"></a> <span class='hs-comment'>-- ** Difference</span> <a name="line-92"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>difference</span> <a name="line-93"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>differenceWith</span> <a name="line-94"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>differenceWithKey</span> <a name="line-95"></a> <a name="line-96"></a> <span class='hs-comment'>-- ** Intersection</span> <a name="line-97"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>intersection</span> <a name="line-98"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>intersectionWith</span> <a name="line-99"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>intersectionWithKey</span> <a name="line-100"></a> <a name="line-101"></a> <span class='hs-comment'>-- * Traversal</span> <a name="line-102"></a> <span class='hs-comment'>-- ** Map</span> <a name="line-103"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>map</span> <a name="line-104"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapWithKey</span> <a name="line-105"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapAccum</span> <a name="line-106"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapAccumWithKey</span> <a name="line-107"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapAccumRWithKey</span> <a name="line-108"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapKeys</span> <a name="line-109"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapKeysWith</span> <a name="line-110"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapKeysMonotonic</span> <a name="line-111"></a> <a name="line-112"></a> <span class='hs-comment'>-- ** Fold</span> <a name="line-113"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fold</span> <a name="line-114"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>foldWithKey</span> <a name="line-115"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>foldrWithKey</span> <a name="line-116"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>foldlWithKey</span> <a name="line-117"></a> <span class='hs-comment'>-- , foldlWithKey'</span> <a name="line-118"></a> <a name="line-119"></a> <span class='hs-comment'>-- * Conversion</span> <a name="line-120"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>elems</span> <a name="line-121"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>keys</span> <a name="line-122"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>keysSet</span> <a name="line-123"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>assocs</span> <a name="line-124"></a> <a name="line-125"></a> <span class='hs-comment'>-- ** Lists</span> <a name="line-126"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>toList</span> <a name="line-127"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fromList</span> <a name="line-128"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fromListWith</span> <a name="line-129"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fromListWithKey</span> <a name="line-130"></a> <a name="line-131"></a> <span class='hs-comment'>-- ** Ordered lists</span> <a name="line-132"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>toAscList</span> <a name="line-133"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>toDescList</span> <a name="line-134"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fromAscList</span> <a name="line-135"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fromAscListWith</span> <a name="line-136"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fromAscListWithKey</span> <a name="line-137"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>fromDistinctAscList</span> <a name="line-138"></a> <a name="line-139"></a> <span class='hs-comment'>-- * Filter </span> <a name="line-140"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>filter</span> <a name="line-141"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>filterWithKey</span> <a name="line-142"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>partition</span> <a name="line-143"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>partitionWithKey</span> <a name="line-144"></a> <a name="line-145"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapMaybe</span> <a name="line-146"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapMaybeWithKey</span> <a name="line-147"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapEither</span> <a name="line-148"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>mapEitherWithKey</span> <a name="line-149"></a> <a name="line-150"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>split</span> <a name="line-151"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>splitLookup</span> <a name="line-152"></a> <a name="line-153"></a> <span class='hs-comment'>-- * Submap</span> <a name="line-154"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>isSubmapOf</span><span class='hs-layout'>,</span> <span class='hs-varid'>isSubmapOfBy</span> <a name="line-155"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>isProperSubmapOf</span><span class='hs-layout'>,</span> <span class='hs-varid'>isProperSubmapOfBy</span> <a name="line-156"></a> <a name="line-157"></a> <span class='hs-comment'>-- * Indexed </span> <a name="line-158"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>lookupIndex</span> <a name="line-159"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>findIndex</span> <a name="line-160"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>elemAt</span> <a name="line-161"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>updateAt</span> <a name="line-162"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>deleteAt</span> <a name="line-163"></a> <a name="line-164"></a> <span class='hs-comment'>-- * Min\/Max</span> <a name="line-165"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>findMin</span> <a name="line-166"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>findMax</span> <a name="line-167"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>deleteMin</span> <a name="line-168"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>deleteMax</span> <a name="line-169"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>deleteFindMin</span> <a name="line-170"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>deleteFindMax</span> <a name="line-171"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>updateMin</span> <a name="line-172"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>updateMax</span> <a name="line-173"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>updateMinWithKey</span> <a name="line-174"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>updateMaxWithKey</span> <a name="line-175"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>minView</span> <a name="line-176"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>maxView</span> <a name="line-177"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>minViewWithKey</span> <a name="line-178"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>maxViewWithKey</span> <a name="line-179"></a> <a name="line-180"></a> <span class='hs-comment'>-- * Debugging</span> <a name="line-181"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>showTree</span> <a name="line-182"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>showTreeWith</span> <a name="line-183"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>valid</span> <a name="line-184"></a> <a name="line-185"></a><span class='hs-cpp'>#if defined(TESTING)</span> <a name="line-186"></a> <span class='hs-comment'>-- * Internals</span> <a name="line-187"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>bin</span> <a name="line-188"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>balanced</span> <a name="line-189"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>join</span> <a name="line-190"></a> <span class='hs-layout'>,</span> <span class='hs-varid'>merge</span> <a name="line-191"></a><span class='hs-cpp'>#endif</span> <a name="line-192"></a> <a name="line-193"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-194"></a> <a name="line-195"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>lookup</span><span class='hs-layout'>,</span><span class='hs-varid'>map</span><span class='hs-layout'>,</span><span class='hs-varid'>filter</span><span class='hs-layout'>,</span><span class='hs-varid'>null</span><span class='hs-layout'>)</span> <a name="line-196"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Set</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Set</span> <a name="line-197"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>List</span> <a name="line-198"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Monoid</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-199"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Applicative</span> <span class='hs-layout'>(</span><span class='hs-conid'>Applicative</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varop'><$></span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-200"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Traversable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Traversable</span><span class='hs-layout'>(</span><span class='hs-varid'>traverse</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-201"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Foldable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Foldable</span><span class='hs-layout'>(</span><span class='hs-varid'>foldMap</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-202"></a><span class='hs-cpp'>#ifndef __GLASGOW_HASKELL__</span> <a name="line-203"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Typeable</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOf</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOfDefault</span> <a name="line-204"></a> <span class='hs-layout'>,</span> <span class='hs-conid'>Typeable1</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOf1</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeOf1Default</span><span class='hs-layout'>)</span> <a name="line-205"></a><span class='hs-cpp'>#endif</span> <a name="line-206"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Typeable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable2</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>TyCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTyCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTyConApp</span><span class='hs-layout'>)</span> <a name="line-207"></a> <a name="line-208"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__</span> <a name="line-209"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Read</span> <a name="line-210"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Data</span> <span class='hs-layout'>(</span><span class='hs-conid'>Data</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkNoRepType</span><span class='hs-layout'>,</span> <span class='hs-varid'>gcast2</span><span class='hs-layout'>)</span> <a name="line-211"></a><span class='hs-cpp'>#endif</span> <a name="line-212"></a> <a name="line-213"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-214"></a> Operators <a name="line-215"></a>--------------------------------------------------------------------}</span> <a name="line-216"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>9</span> <span class='hs-varop'>!</span><span class='hs-layout'>,</span><span class='hs-varop'>\\</span> <span class='hs-comment'>--</span> <a name="line-217"></a> <a name="line-218"></a><span class='hs-comment'>-- | /O(log n)/. Find the value at a key.</span> <a name="line-219"></a><span class='hs-comment'>-- Calls 'error' when the element can not be found.</span> <a name="line-220"></a><span class='hs-comment'>--</span> <a name="line-221"></a><span class='hs-comment'>-- > fromList [(5,'a'), (3,'b')] ! 1 Error: element not in the map</span> <a name="line-222"></a><span class='hs-comment'>-- > fromList [(5,'a'), (3,'b')] ! 5 == 'a'</span> <a name="line-223"></a> <a name="line-224"></a><a name="!"></a><span class='hs-layout'>(</span><span class='hs-varop'>!</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <a name="line-225"></a><a name="m"></a><span class='hs-definition'>m</span> <span class='hs-varop'>!</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>find</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <a name="line-226"></a> <a name="line-227"></a><a name="\\"></a><span class='hs-comment'>-- | Same as 'difference'.</span> <a name="line-228"></a><span class='hs-layout'>(</span><span class='hs-varop'>\\</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-229"></a><a name="m1"></a><span class='hs-definition'>m1</span> <span class='hs-varop'>\\</span> <span class='hs-varid'>m2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>difference</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-230"></a> <a name="line-231"></a><a name="Map"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-232"></a> Size balanced trees. <a name="line-233"></a>--------------------------------------------------------------------}</span> <a name="line-234"></a><a name="Map"></a><span class='hs-comment'>-- | A Map from keys @k@ to values @a@. </span> <a name="line-235"></a><a name="Map"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-236"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Bin</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Size</span> <span class='hs-varop'>!</span><span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-237"></a> <a name="line-238"></a><a name="Size"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Size</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span> <a name="line-239"></a> <a name="line-240"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Monoid</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-241"></a> <span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span> <a name="line-242"></a> <span class='hs-varid'>mappend</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>union</span> <a name="line-243"></a> <span class='hs-varid'>mconcat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unions</span> <a name="line-244"></a> <a name="line-245"></a><span class='hs-cpp'>#if __GLASGOW_HASKELL__</span> <a name="line-246"></a> <a name="line-247"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-248"></a> A Data instance <a name="line-249"></a>--------------------------------------------------------------------}</span> <a name="line-250"></a> <a name="line-251"></a><span class='hs-comment'>-- This instance preserves data abstraction at the cost of inefficiency.</span> <a name="line-252"></a><span class='hs-comment'>-- We omit reflection services for the sake of data abstraction.</span> <a name="line-253"></a> <a name="line-254"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Data</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Data</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Data</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-255"></a> <span class='hs-varid'>gfoldl</span> <span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <span class='hs-varid'>fromList</span> <span class='hs-varop'>`f`</span> <span class='hs-varid'>toList</span> <span class='hs-varid'>m</span> <a name="line-256"></a> <span class='hs-varid'>toConstr</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"toConstr"</span> <a name="line-257"></a> <span class='hs-varid'>gunfold</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"gunfold"</span> <a name="line-258"></a> <span class='hs-varid'>dataTypeOf</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkNoRepType</span> <span class='hs-str'>"Data.Map.Map"</span> <a name="line-259"></a> <span class='hs-varid'>dataCast2</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>gcast2</span> <span class='hs-varid'>f</span> <a name="line-260"></a> <a name="line-261"></a><span class='hs-cpp'>#endif</span> <a name="line-262"></a> <a name="line-263"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-264"></a> Query <a name="line-265"></a>--------------------------------------------------------------------}</span> <a name="line-266"></a><span class='hs-comment'>-- | /O(1)/. Is the map empty?</span> <a name="line-267"></a><span class='hs-comment'>--</span> <a name="line-268"></a><span class='hs-comment'>-- > Data.Map.null (empty) == True</span> <a name="line-269"></a><span class='hs-comment'>-- > Data.Map.null (singleton 1 'a') == False</span> <a name="line-270"></a> <a name="line-271"></a><a name="null"></a><span class='hs-definition'>null</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-272"></a><span class='hs-definition'>null</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-273"></a><span class='hs-definition'>null</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-274"></a> <a name="line-275"></a><span class='hs-comment'>-- | /O(1)/. The number of elements in the map.</span> <a name="line-276"></a><span class='hs-comment'>--</span> <a name="line-277"></a><span class='hs-comment'>-- > size empty == 0</span> <a name="line-278"></a><span class='hs-comment'>-- > size (singleton 1 'a') == 1</span> <a name="line-279"></a><span class='hs-comment'>-- > size (fromList([(1,'a'), (2,'c'), (3,'b')])) == 3</span> <a name="line-280"></a> <a name="line-281"></a><a name="size"></a><span class='hs-definition'>size</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <a name="line-282"></a><span class='hs-definition'>size</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span> <a name="line-283"></a><span class='hs-definition'>size</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sz</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sz</span> <a name="line-284"></a> <a name="line-285"></a> <a name="line-286"></a><span class='hs-comment'>-- | /O(log n)/. Lookup the value at a key in the map.</span> <a name="line-287"></a><span class='hs-comment'>--</span> <a name="line-288"></a><span class='hs-comment'>-- The function will return the corresponding value as @('Just' value)@,</span> <a name="line-289"></a><span class='hs-comment'>-- or 'Nothing' if the key isn't in the map.</span> <a name="line-290"></a><span class='hs-comment'>--</span> <a name="line-291"></a><span class='hs-comment'>-- An example of using @lookup@:</span> <a name="line-292"></a><span class='hs-comment'>--</span> <a name="line-293"></a><span class='hs-comment'>-- > import Prelude hiding (lookup)</span> <a name="line-294"></a><span class='hs-comment'>-- > import Data.Map</span> <a name="line-295"></a><span class='hs-comment'>-- ></span> <a name="line-296"></a><span class='hs-comment'>-- > employeeDept = fromList([("John","Sales"), ("Bob","IT")])</span> <a name="line-297"></a><span class='hs-comment'>-- > deptCountry = fromList([("IT","USA"), ("Sales","France")])</span> <a name="line-298"></a><span class='hs-comment'>-- > countryCurrency = fromList([("USA", "Dollar"), ("France", "Euro")])</span> <a name="line-299"></a><span class='hs-comment'>-- ></span> <a name="line-300"></a><span class='hs-comment'>-- > employeeCurrency :: String -> Maybe String</span> <a name="line-301"></a><span class='hs-comment'>-- > employeeCurrency name = do</span> <a name="line-302"></a><span class='hs-comment'>-- > dept <- lookup name employeeDept</span> <a name="line-303"></a><span class='hs-comment'>-- > country <- lookup dept deptCountry</span> <a name="line-304"></a><span class='hs-comment'>-- > lookup country countryCurrency</span> <a name="line-305"></a><span class='hs-comment'>-- ></span> <a name="line-306"></a><span class='hs-comment'>-- > main = do</span> <a name="line-307"></a><span class='hs-comment'>-- > putStrLn $ "John's currency: " ++ (show (employeeCurrency "John"))</span> <a name="line-308"></a><span class='hs-comment'>-- > putStrLn $ "Pete's currency: " ++ (show (employeeCurrency "Pete"))</span> <a name="line-309"></a><span class='hs-comment'>--</span> <a name="line-310"></a><span class='hs-comment'>-- The output of this program:</span> <a name="line-311"></a><span class='hs-comment'>--</span> <a name="line-312"></a><span class='hs-comment'>-- > John's currency: Just "Euro"</span> <a name="line-313"></a><span class='hs-comment'>-- > Pete's currency: Nothing</span> <a name="line-314"></a> <a name="line-315"></a><a name="lookup"></a><span class='hs-definition'>lookup</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span> <a name="line-316"></a><span class='hs-definition'>lookup</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-317"></a> <span class='hs-keyword'>where</span> <a name="line-318"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> <a name="line-319"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-320"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-321"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <a name="line-322"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <a name="line-323"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <a name="line-324"></a> <a name="line-325"></a><a name="lookupAssoc"></a><span class='hs-definition'>lookupAssoc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-326"></a><span class='hs-definition'>lookupAssoc</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-327"></a> <span class='hs-keyword'>where</span> <a name="line-328"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> <a name="line-329"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-330"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-331"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <a name="line-332"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <a name="line-333"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-334"></a> <a name="line-335"></a><span class='hs-comment'>-- | /O(log n)/. Is the key a member of the map? See also 'notMember'.</span> <a name="line-336"></a><span class='hs-comment'>--</span> <a name="line-337"></a><span class='hs-comment'>-- > member 5 (fromList [(5,'a'), (3,'b')]) == True</span> <a name="line-338"></a><span class='hs-comment'>-- > member 1 (fromList [(5,'a'), (3,'b')]) == False</span> <a name="line-339"></a> <a name="line-340"></a><a name="member"></a><span class='hs-definition'>member</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-341"></a><span class='hs-definition'>member</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookup</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>of</span> <a name="line-342"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-343"></a> <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-344"></a> <a name="line-345"></a><span class='hs-comment'>-- | /O(log n)/. Is the key not a member of the map? See also 'member'.</span> <a name="line-346"></a><span class='hs-comment'>--</span> <a name="line-347"></a><span class='hs-comment'>-- > notMember 5 (fromList [(5,'a'), (3,'b')]) == False</span> <a name="line-348"></a><span class='hs-comment'>-- > notMember 1 (fromList [(5,'a'), (3,'b')]) == True</span> <a name="line-349"></a> <a name="line-350"></a><a name="notMember"></a><span class='hs-definition'>notMember</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-351"></a><span class='hs-definition'>notMember</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-varop'>$</span> <span class='hs-varid'>member</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <a name="line-352"></a> <a name="line-353"></a><a name="find"></a><span class='hs-comment'>-- | /O(log n)/. Find the value at a key.</span> <a name="line-354"></a><span class='hs-comment'>-- Calls 'error' when the element can not be found.</span> <a name="line-355"></a><span class='hs-comment'>-- Consider using 'lookup' when elements may not be present.</span> <a name="line-356"></a><span class='hs-definition'>find</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <a name="line-357"></a><span class='hs-definition'>find</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookup</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>of</span> <a name="line-358"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>error</span> <span class='hs-str'>"Map.find: element not in the map"</span> <a name="line-359"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>x</span> <a name="line-360"></a> <a name="line-361"></a><span class='hs-comment'>-- | /O(log n)/. The expression @('findWithDefault' def k map)@ returns</span> <a name="line-362"></a><span class='hs-comment'>-- the value at key @k@ or returns default value @def@</span> <a name="line-363"></a><span class='hs-comment'>-- when the key is not in the map.</span> <a name="line-364"></a><span class='hs-comment'>--</span> <a name="line-365"></a><span class='hs-comment'>-- > findWithDefault 'x' 1 (fromList [(5,'a'), (3,'b')]) == 'x'</span> <a name="line-366"></a><span class='hs-comment'>-- > findWithDefault 'x' 5 (fromList [(5,'a'), (3,'b')]) == 'a'</span> <a name="line-367"></a> <a name="line-368"></a><a name="findWithDefault"></a><span class='hs-definition'>findWithDefault</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <a name="line-369"></a><span class='hs-definition'>findWithDefault</span> <span class='hs-varid'>def</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookup</span> <span class='hs-varid'>k</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>of</span> <a name="line-370"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>def</span> <a name="line-371"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>x</span> <a name="line-372"></a> <a name="line-373"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-374"></a> Construction <a name="line-375"></a>--------------------------------------------------------------------}</span> <a name="line-376"></a><span class='hs-comment'>-- | /O(1)/. The empty map.</span> <a name="line-377"></a><span class='hs-comment'>--</span> <a name="line-378"></a><span class='hs-comment'>-- > empty == fromList []</span> <a name="line-379"></a><span class='hs-comment'>-- > size empty == 0</span> <a name="line-380"></a> <a name="line-381"></a><a name="empty"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-382"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-383"></a> <a name="line-384"></a><span class='hs-comment'>-- | /O(1)/. A map with a single element.</span> <a name="line-385"></a><span class='hs-comment'>--</span> <a name="line-386"></a><span class='hs-comment'>-- > singleton 1 'a' == fromList [(1, 'a')]</span> <a name="line-387"></a><span class='hs-comment'>-- > size (singleton 1 'a') == 1</span> <a name="line-388"></a> <a name="line-389"></a><a name="singleton"></a><span class='hs-definition'>singleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-390"></a><span class='hs-definition'>singleton</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-num'>1</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Tip</span> <span class='hs-conid'>Tip</span> <a name="line-391"></a> <a name="line-392"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-393"></a> Insertion <a name="line-394"></a>--------------------------------------------------------------------}</span> <a name="line-395"></a><span class='hs-comment'>-- | /O(log n)/. Insert a new key and value in the map.</span> <a name="line-396"></a><span class='hs-comment'>-- If the key is already present in the map, the associated value is</span> <a name="line-397"></a><span class='hs-comment'>-- replaced with the supplied value. 'insert' is equivalent to</span> <a name="line-398"></a><span class='hs-comment'>-- @'insertWith' 'const'@.</span> <a name="line-399"></a><span class='hs-comment'>--</span> <a name="line-400"></a><span class='hs-comment'>-- > insert 5 'x' (fromList [(5,'a'), (3,'b')]) == fromList [(3, 'b'), (5, 'x')]</span> <a name="line-401"></a><span class='hs-comment'>-- > insert 7 'x' (fromList [(5,'a'), (3,'b')]) == fromList [(3, 'b'), (5, 'a'), (7, 'x')]</span> <a name="line-402"></a><span class='hs-comment'>-- > insert 5 'x' empty == singleton 5 'x'</span> <a name="line-403"></a> <a name="line-404"></a><a name="insert"></a><span class='hs-definition'>insert</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-405"></a><span class='hs-definition'>insert</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kx</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-406"></a> <span class='hs-keyword'>where</span> <a name="line-407"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <a name="line-408"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sz</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-409"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>ky</span> <span class='hs-keyword'>of</span> <a name="line-410"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-411"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-412"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sz</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-413"></a> <a name="line-414"></a><span class='hs-comment'>-- | /O(log n)/. Insert with a function, combining new value and old value.</span> <a name="line-415"></a><span class='hs-comment'>-- @'insertWith' f key value mp@ </span> <a name="line-416"></a><span class='hs-comment'>-- will insert the pair (key, value) into @mp@ if key does</span> <a name="line-417"></a><span class='hs-comment'>-- not exist in the map. If the key does exist, the function will</span> <a name="line-418"></a><span class='hs-comment'>-- insert the pair @(key, f new_value old_value)@.</span> <a name="line-419"></a><span class='hs-comment'>--</span> <a name="line-420"></a><span class='hs-comment'>-- > insertWith (++) 5 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "xxxa")]</span> <a name="line-421"></a><span class='hs-comment'>-- > insertWith (++) 7 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a"), (7, "xxx")]</span> <a name="line-422"></a><span class='hs-comment'>-- > insertWith (++) 5 "xxx" empty == singleton 5 "xxx"</span> <a name="line-423"></a> <a name="line-424"></a><a name="insertWith"></a><span class='hs-definition'>insertWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-425"></a><span class='hs-definition'>insertWith</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>y'</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>y'</span><span class='hs-layout'>)</span> <a name="line-426"></a> <a name="line-427"></a><a name="insertWith'"></a><span class='hs-comment'>-- | Same as 'insertWith', but the combining function is applied strictly.</span> <a name="line-428"></a><span class='hs-comment'>-- This is often the most desirable behavior.</span> <a name="line-429"></a><span class='hs-comment'>--</span> <a name="line-430"></a><span class='hs-comment'>-- For example, to update a counter:</span> <a name="line-431"></a><span class='hs-comment'>--</span> <a name="line-432"></a><span class='hs-comment'>-- > insertWith' (+) k 1 m</span> <a name="line-433"></a><span class='hs-comment'>--</span> <a name="line-434"></a><span class='hs-definition'>insertWith'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-435"></a><span class='hs-definition'>insertWith'</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertWithKey'</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>y'</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>y'</span><span class='hs-layout'>)</span> <a name="line-436"></a> <a name="line-437"></a><span class='hs-comment'>-- | /O(log n)/. Insert with a function, combining key, new value and old value.</span> <a name="line-438"></a><span class='hs-comment'>-- @'insertWithKey' f key value mp@ </span> <a name="line-439"></a><span class='hs-comment'>-- will insert the pair (key, value) into @mp@ if key does</span> <a name="line-440"></a><span class='hs-comment'>-- not exist in the map. If the key does exist, the function will</span> <a name="line-441"></a><span class='hs-comment'>-- insert the pair @(key,f key new_value old_value)@.</span> <a name="line-442"></a><span class='hs-comment'>-- Note that the key passed to f is the same key passed to 'insertWithKey'.</span> <a name="line-443"></a><span class='hs-comment'>--</span> <a name="line-444"></a><span class='hs-comment'>-- > let f key new_value old_value = (show key) ++ ":" ++ new_value ++ "|" ++ old_value</span> <a name="line-445"></a><span class='hs-comment'>-- > insertWithKey f 5 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "5:xxx|a")]</span> <a name="line-446"></a><span class='hs-comment'>-- > insertWithKey f 7 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a"), (7, "xxx")]</span> <a name="line-447"></a><span class='hs-comment'>-- > insertWithKey f 5 "xxx" empty == singleton 5 "xxx"</span> <a name="line-448"></a> <a name="line-449"></a><a name="insertWithKey"></a><span class='hs-definition'>insertWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-450"></a><span class='hs-definition'>insertWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kx</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-451"></a> <span class='hs-keyword'>where</span> <a name="line-452"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <a name="line-453"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-454"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>ky</span> <span class='hs-keyword'>of</span> <a name="line-455"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-456"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-457"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>kx</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-458"></a> <a name="line-459"></a><a name="insertWithKey'"></a><span class='hs-comment'>-- | Same as 'insertWithKey', but the combining function is applied strictly.</span> <a name="line-460"></a><span class='hs-definition'>insertWithKey'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-461"></a><span class='hs-definition'>insertWithKey'</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kx</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-462"></a> <span class='hs-keyword'>where</span> <a name="line-463"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>kx</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>x</span> <a name="line-464"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-465"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>ky</span> <span class='hs-keyword'>of</span> <a name="line-466"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-467"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-468"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>x'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-469"></a> <a name="line-470"></a><span class='hs-comment'>-- | /O(log n)/. Combines insert operation with old value retrieval.</span> <a name="line-471"></a><span class='hs-comment'>-- The expression (@'insertLookupWithKey' f k x map@)</span> <a name="line-472"></a><span class='hs-comment'>-- is a pair where the first element is equal to (@'lookup' k map@)</span> <a name="line-473"></a><span class='hs-comment'>-- and the second element equal to (@'insertWithKey' f k x map@).</span> <a name="line-474"></a><span class='hs-comment'>--</span> <a name="line-475"></a><span class='hs-comment'>-- > let f key new_value old_value = (show key) ++ ":" ++ new_value ++ "|" ++ old_value</span> <a name="line-476"></a><span class='hs-comment'>-- > insertLookupWithKey f 5 "xxx" (fromList [(5,"a"), (3,"b")]) == (Just "a", fromList [(3, "b"), (5, "5:xxx|a")])</span> <a name="line-477"></a><span class='hs-comment'>-- > insertLookupWithKey f 7 "xxx" (fromList [(5,"a"), (3,"b")]) == (Nothing, fromList [(3, "b"), (5, "a"), (7, "xxx")])</span> <a name="line-478"></a><span class='hs-comment'>-- > insertLookupWithKey f 5 "xxx" empty == (Nothing, singleton 5 "xxx")</span> <a name="line-479"></a><span class='hs-comment'>--</span> <a name="line-480"></a><span class='hs-comment'>-- This is how to define @insertLookup@ using @insertLookupWithKey@:</span> <a name="line-481"></a><span class='hs-comment'>--</span> <a name="line-482"></a><span class='hs-comment'>-- > let insertLookup kx x t = insertLookupWithKey (\_ a _ -> a) kx x t</span> <a name="line-483"></a><span class='hs-comment'>-- > insertLookup 5 "x" (fromList [(5,"a"), (3,"b")]) == (Just "a", fromList [(3, "b"), (5, "x")])</span> <a name="line-484"></a><span class='hs-comment'>-- > insertLookup 7 "x" (fromList [(5,"a"), (3,"b")]) == (Nothing, fromList [(3, "b"), (5, "a"), (7, "x")])</span> <a name="line-485"></a> <a name="line-486"></a><a name="insertLookupWithKey"></a><span class='hs-definition'>insertLookupWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-487"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-488"></a><span class='hs-definition'>insertLookupWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kx</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-489"></a> <span class='hs-keyword'>where</span> <a name="line-490"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-491"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-492"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>ky</span> <span class='hs-keyword'>of</span> <a name="line-493"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <a name="line-494"></a> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l'</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-495"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <a name="line-496"></a> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <a name="line-497"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>kx</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-498"></a> <a name="line-499"></a><a name="insertLookupWithKey'"></a><span class='hs-comment'>-- | /O(log n)/. A strict version of 'insertLookupWithKey'.</span> <a name="line-500"></a><span class='hs-definition'>insertLookupWithKey'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-501"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-502"></a><span class='hs-definition'>insertLookupWithKey'</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kx</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-503"></a> <span class='hs-keyword'>where</span> <a name="line-504"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-varop'>`seq`</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-505"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-506"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>ky</span> <span class='hs-keyword'>of</span> <a name="line-507"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <a name="line-508"></a> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l'</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-509"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <a name="line-510"></a> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <a name="line-511"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>x'</span> <span class='hs-varop'>`seq`</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sy</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-512"></a> <a name="line-513"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-514"></a> Deletion <a name="line-515"></a> [delete] is the inlined version of [deleteWith (\k x -> Nothing)] <a name="line-516"></a>--------------------------------------------------------------------}</span> <a name="line-517"></a><span class='hs-comment'>-- | /O(log n)/. Delete a key and its value from the map. When the key is not</span> <a name="line-518"></a><span class='hs-comment'>-- a member of the map, the original map is returned.</span> <a name="line-519"></a><span class='hs-comment'>--</span> <a name="line-520"></a><span class='hs-comment'>-- > delete 5 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span> <a name="line-521"></a><span class='hs-comment'>-- > delete 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span> <a name="line-522"></a><span class='hs-comment'>-- > delete 5 empty == empty</span> <a name="line-523"></a> <a name="line-524"></a><a name="delete"></a><span class='hs-definition'>delete</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-525"></a><span class='hs-definition'>delete</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-526"></a> <span class='hs-keyword'>where</span> <a name="line-527"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-528"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-529"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-530"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-531"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-532"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>glue</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-533"></a> <a name="line-534"></a><span class='hs-comment'>-- | /O(log n)/. Update a value at a specific key with the result of the provided function.</span> <a name="line-535"></a><span class='hs-comment'>-- When the key is not</span> <a name="line-536"></a><span class='hs-comment'>-- a member of the map, the original map is returned.</span> <a name="line-537"></a><span class='hs-comment'>--</span> <a name="line-538"></a><span class='hs-comment'>-- > adjust ("new " ++) 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "new a")]</span> <a name="line-539"></a><span class='hs-comment'>-- > adjust ("new " ++) 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span> <a name="line-540"></a><span class='hs-comment'>-- > adjust ("new " ++) 7 empty == empty</span> <a name="line-541"></a> <a name="line-542"></a><a name="adjust"></a><span class='hs-definition'>adjust</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-543"></a><span class='hs-definition'>adjust</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>adjustWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-544"></a> <a name="line-545"></a><span class='hs-comment'>-- | /O(log n)/. Adjust a value at a specific key. When the key is not</span> <a name="line-546"></a><span class='hs-comment'>-- a member of the map, the original map is returned.</span> <a name="line-547"></a><span class='hs-comment'>--</span> <a name="line-548"></a><span class='hs-comment'>-- > let f key x = (show key) ++ ":new " ++ x</span> <a name="line-549"></a><span class='hs-comment'>-- > adjustWithKey f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "5:new a")]</span> <a name="line-550"></a><span class='hs-comment'>-- > adjustWithKey f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span> <a name="line-551"></a><span class='hs-comment'>-- > adjustWithKey f 7 empty == empty</span> <a name="line-552"></a> <a name="line-553"></a><a name="adjustWithKey"></a><span class='hs-definition'>adjustWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-554"></a><span class='hs-definition'>adjustWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k'</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>k'</span> <span class='hs-varid'>x'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-555"></a> <a name="line-556"></a><span class='hs-comment'>-- | /O(log n)/. The expression (@'update' f k map@) updates the value @x@</span> <a name="line-557"></a><span class='hs-comment'>-- at @k@ (if it is in the map). If (@f x@) is 'Nothing', the element is</span> <a name="line-558"></a><span class='hs-comment'>-- deleted. If it is (@'Just' y@), the key @k@ is bound to the new value @y@.</span> <a name="line-559"></a><span class='hs-comment'>--</span> <a name="line-560"></a><span class='hs-comment'>-- > let f x = if x == "a" then Just "new a" else Nothing</span> <a name="line-561"></a><span class='hs-comment'>-- > update f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "new a")]</span> <a name="line-562"></a><span class='hs-comment'>-- > update f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span> <a name="line-563"></a><span class='hs-comment'>-- > update f 3 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span> <a name="line-564"></a> <a name="line-565"></a><a name="update"></a><span class='hs-definition'>update</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-566"></a><span class='hs-definition'>update</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-567"></a> <a name="line-568"></a><span class='hs-comment'>-- | /O(log n)/. The expression (@'updateWithKey' f k map@) updates the</span> <a name="line-569"></a><span class='hs-comment'>-- value @x@ at @k@ (if it is in the map). If (@f k x@) is 'Nothing',</span> <a name="line-570"></a><span class='hs-comment'>-- the element is deleted. If it is (@'Just' y@), the key @k@ is bound</span> <a name="line-571"></a><span class='hs-comment'>-- to the new value @y@.</span> <a name="line-572"></a><span class='hs-comment'>--</span> <a name="line-573"></a><span class='hs-comment'>-- > let f k x = if x == "a" then Just ((show k) ++ ":new a") else Nothing</span> <a name="line-574"></a><span class='hs-comment'>-- > updateWithKey f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "5:new a")]</span> <a name="line-575"></a><span class='hs-comment'>-- > updateWithKey f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span> <a name="line-576"></a><span class='hs-comment'>-- > updateWithKey f 3 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span> <a name="line-577"></a> <a name="line-578"></a><a name="updateWithKey"></a><span class='hs-definition'>updateWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-579"></a><span class='hs-definition'>updateWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-580"></a> <span class='hs-keyword'>where</span> <a name="line-581"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-582"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-583"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-584"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-585"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-586"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-587"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-588"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>glue</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-589"></a> <a name="line-590"></a><span class='hs-comment'>-- | /O(log n)/. Lookup and update. See also 'updateWithKey'.</span> <a name="line-591"></a><span class='hs-comment'>-- The function returns changed value, if it is updated.</span> <a name="line-592"></a><span class='hs-comment'>-- Returns the original key value if the map entry is deleted. </span> <a name="line-593"></a><span class='hs-comment'>--</span> <a name="line-594"></a><span class='hs-comment'>-- > let f k x = if x == "a" then Just ((show k) ++ ":new a") else Nothing</span> <a name="line-595"></a><span class='hs-comment'>-- > updateLookupWithKey f 5 (fromList [(5,"a"), (3,"b")]) == (Just "5:new a", fromList [(3, "b"), (5, "5:new a")])</span> <a name="line-596"></a><span class='hs-comment'>-- > updateLookupWithKey f 7 (fromList [(5,"a"), (3,"b")]) == (Nothing, fromList [(3, "b"), (5, "a")])</span> <a name="line-597"></a><span class='hs-comment'>-- > updateLookupWithKey f 3 (fromList [(5,"a"), (3,"b")]) == (Just "b", singleton 5 "a")</span> <a name="line-598"></a> <a name="line-599"></a><a name="updateLookupWithKey"></a><span class='hs-definition'>updateLookupWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-600"></a><span class='hs-definition'>updateLookupWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-601"></a> <span class='hs-keyword'>where</span> <a name="line-602"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span><span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-603"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-604"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-605"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l'</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-606"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <a name="line-607"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-608"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x'</span><span class='hs-layout'>,</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-609"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>glue</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-610"></a> <a name="line-611"></a><span class='hs-comment'>-- | /O(log n)/. The expression (@'alter' f k map@) alters the value @x@ at @k@, or absence thereof.</span> <a name="line-612"></a><span class='hs-comment'>-- 'alter' can be used to insert, delete, or update a value in a 'Map'.</span> <a name="line-613"></a><span class='hs-comment'>-- In short : @'lookup' k ('alter' f k m) = f ('lookup' k m)@.</span> <a name="line-614"></a><span class='hs-comment'>--</span> <a name="line-615"></a><span class='hs-comment'>-- > let f _ = Nothing</span> <a name="line-616"></a><span class='hs-comment'>-- > alter f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span> <a name="line-617"></a><span class='hs-comment'>-- > alter f 5 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span> <a name="line-618"></a><span class='hs-comment'>-- ></span> <a name="line-619"></a><span class='hs-comment'>-- > let f _ = Just "c"</span> <a name="line-620"></a><span class='hs-comment'>-- > alter f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a"), (7, "c")]</span> <a name="line-621"></a><span class='hs-comment'>-- > alter f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "c")]</span> <a name="line-622"></a> <a name="line-623"></a><a name="alter"></a><span class='hs-definition'>alter</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-624"></a><span class='hs-definition'>alter</span> <span class='hs-varid'>f</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <a name="line-625"></a> <span class='hs-keyword'>where</span> <a name="line-626"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyword'>of</span> <a name="line-627"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Tip</span> <a name="line-628"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <a name="line-629"></a> <a name="line-630"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-631"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-632"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-633"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <a name="line-634"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-635"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>glue</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-636"></a> <a name="line-637"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-638"></a> Indexing <a name="line-639"></a>--------------------------------------------------------------------}</span> <a name="line-640"></a><span class='hs-comment'>-- | /O(log n)/. Return the /index/ of a key. The index is a number from</span> <a name="line-641"></a><span class='hs-comment'>-- /0/ up to, but not including, the 'size' of the map. Calls 'error' when</span> <a name="line-642"></a><span class='hs-comment'>-- the key is not a 'member' of the map.</span> <a name="line-643"></a><span class='hs-comment'>--</span> <a name="line-644"></a><span class='hs-comment'>-- > findIndex 2 (fromList [(5,"a"), (3,"b")]) Error: element is not in the map</span> <a name="line-645"></a><span class='hs-comment'>-- > findIndex 3 (fromList [(5,"a"), (3,"b")]) == 0</span> <a name="line-646"></a><span class='hs-comment'>-- > findIndex 5 (fromList [(5,"a"), (3,"b")]) == 1</span> <a name="line-647"></a><span class='hs-comment'>-- > findIndex 6 (fromList [(5,"a"), (3,"b")]) Error: element is not in the map</span> <a name="line-648"></a> <a name="line-649"></a><a name="findIndex"></a><span class='hs-definition'>findIndex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <a name="line-650"></a><span class='hs-definition'>findIndex</span> <span class='hs-varid'>k</span> <span class='hs-varid'>t</span> <a name="line-651"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupIndex</span> <span class='hs-varid'>k</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-652"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>error</span> <span class='hs-str'>"Map.findIndex: element is not in the map"</span> <a name="line-653"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>idx</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>idx</span> <a name="line-654"></a> <a name="line-655"></a><span class='hs-comment'>-- | /O(log n)/. Lookup the /index/ of a key. The index is a number from</span> <a name="line-656"></a><span class='hs-comment'>-- /0/ up to, but not including, the 'size' of the map.</span> <a name="line-657"></a><span class='hs-comment'>--</span> <a name="line-658"></a><span class='hs-comment'>-- > isJust (lookupIndex 2 (fromList [(5,"a"), (3,"b")])) == False</span> <a name="line-659"></a><span class='hs-comment'>-- > fromJust (lookupIndex 3 (fromList [(5,"a"), (3,"b")])) == 0</span> <a name="line-660"></a><span class='hs-comment'>-- > fromJust (lookupIndex 5 (fromList [(5,"a"), (3,"b")])) == 1</span> <a name="line-661"></a><span class='hs-comment'>-- > isJust (lookupIndex 6 (fromList [(5,"a"), (3,"b")])) == False</span> <a name="line-662"></a> <a name="line-663"></a><a name="lookupIndex"></a><span class='hs-definition'>lookupIndex</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Int</span> <a name="line-664"></a><span class='hs-definition'>lookupIndex</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <span class='hs-num'>0</span> <a name="line-665"></a> <span class='hs-keyword'>where</span> <a name="line-666"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>idx</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idx</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>Nothing</span> <a name="line-667"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>idx</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-668"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>idx</span> <span class='hs-varop'>`seq`</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-669"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-varid'>idx</span> <span class='hs-varid'>l</span> <a name="line-670"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>idx</span> <span class='hs-varop'>+</span> <span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-671"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>idx</span> <span class='hs-varop'>+</span> <span class='hs-varid'>size</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <a name="line-672"></a> <a name="line-673"></a><span class='hs-comment'>-- | /O(log n)/. Retrieve an element by /index/. Calls 'error' when an</span> <a name="line-674"></a><span class='hs-comment'>-- invalid index is used.</span> <a name="line-675"></a><span class='hs-comment'>--</span> <a name="line-676"></a><span class='hs-comment'>-- > elemAt 0 (fromList [(5,"a"), (3,"b")]) == (3,"b")</span> <a name="line-677"></a><span class='hs-comment'>-- > elemAt 1 (fromList [(5,"a"), (3,"b")]) == (5, "a")</span> <a name="line-678"></a><span class='hs-comment'>-- > elemAt 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range</span> <a name="line-679"></a> <a name="line-680"></a><a name="elemAt"></a><span class='hs-definition'>elemAt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-681"></a><span class='hs-definition'>elemAt</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Map.elemAt: index out of range"</span> <a name="line-682"></a><span class='hs-definition'>elemAt</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-683"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>i</span> <span class='hs-varid'>sizeL</span> <span class='hs-keyword'>of</span> <a name="line-684"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>elemAt</span> <span class='hs-varid'>i</span> <span class='hs-varid'>l</span> <a name="line-685"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>elemAt</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-varid'>sizeL</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-686"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-687"></a> <span class='hs-keyword'>where</span> <a name="line-688"></a> <span class='hs-varid'>sizeL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <a name="line-689"></a> <a name="line-690"></a><span class='hs-comment'>-- | /O(log n)/. Update the element at /index/. Calls 'error' when an</span> <a name="line-691"></a><span class='hs-comment'>-- invalid index is used.</span> <a name="line-692"></a><span class='hs-comment'>--</span> <a name="line-693"></a><span class='hs-comment'>-- > updateAt (\ _ _ -> Just "x") 0 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "x"), (5, "a")]</span> <a name="line-694"></a><span class='hs-comment'>-- > updateAt (\ _ _ -> Just "x") 1 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "x")]</span> <a name="line-695"></a><span class='hs-comment'>-- > updateAt (\ _ _ -> Just "x") 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range</span> <a name="line-696"></a><span class='hs-comment'>-- > updateAt (\ _ _ -> Just "x") (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range</span> <a name="line-697"></a><span class='hs-comment'>-- > updateAt (\_ _ -> Nothing) 0 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span> <a name="line-698"></a><span class='hs-comment'>-- > updateAt (\_ _ -> Nothing) 1 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span> <a name="line-699"></a><span class='hs-comment'>-- > updateAt (\_ _ -> Nothing) 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range</span> <a name="line-700"></a><span class='hs-comment'>-- > updateAt (\_ _ -> Nothing) (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range</span> <a name="line-701"></a> <a name="line-702"></a><a name="updateAt"></a><span class='hs-definition'>updateAt</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-703"></a><span class='hs-definition'>updateAt</span> <span class='hs-varid'>f</span> <span class='hs-varid'>i0</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>i0</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <span class='hs-varid'>i0</span> <span class='hs-varid'>t</span> <a name="line-704"></a> <span class='hs-keyword'>where</span> <a name="line-705"></a> <span class='hs-varid'>go</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Map.updateAt: index out of range"</span> <a name="line-706"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>i</span> <span class='hs-varid'>sizeL</span> <span class='hs-keyword'>of</span> <a name="line-707"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-708"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-comment'>-</span><span class='hs-varid'>sizeL</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-709"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-710"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-711"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>glue</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-712"></a> <span class='hs-keyword'>where</span> <a name="line-713"></a> <span class='hs-varid'>sizeL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <a name="line-714"></a> <a name="line-715"></a><span class='hs-comment'>-- | /O(log n)/. Delete the element at /index/.</span> <a name="line-716"></a><span class='hs-comment'>-- Defined as (@'deleteAt' i map = 'updateAt' (\k x -> 'Nothing') i map@).</span> <a name="line-717"></a><span class='hs-comment'>--</span> <a name="line-718"></a><span class='hs-comment'>-- > deleteAt 0 (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span> <a name="line-719"></a><span class='hs-comment'>-- > deleteAt 1 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span> <a name="line-720"></a><span class='hs-comment'>-- > deleteAt 2 (fromList [(5,"a"), (3,"b")]) Error: index out of range</span> <a name="line-721"></a><span class='hs-comment'>-- > deleteAt (-1) (fromList [(5,"a"), (3,"b")]) Error: index out of range</span> <a name="line-722"></a> <a name="line-723"></a><a name="deleteAt"></a><span class='hs-definition'>deleteAt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-724"></a><span class='hs-definition'>deleteAt</span> <span class='hs-varid'>i</span> <span class='hs-varid'>m</span> <a name="line-725"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateAt</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span> <span class='hs-varid'>i</span> <span class='hs-varid'>m</span> <a name="line-726"></a> <a name="line-727"></a> <a name="line-728"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-729"></a> Minimal, Maximal <a name="line-730"></a>--------------------------------------------------------------------}</span> <a name="line-731"></a><span class='hs-comment'>-- | /O(log n)/. The minimal key of the map. Calls 'error' is the map is empty.</span> <a name="line-732"></a><span class='hs-comment'>--</span> <a name="line-733"></a><span class='hs-comment'>-- > findMin (fromList [(5,"a"), (3,"b")]) == (3,"b")</span> <a name="line-734"></a><span class='hs-comment'>-- > findMin empty Error: empty map has no minimal element</span> <a name="line-735"></a> <a name="line-736"></a><a name="findMin"></a><span class='hs-definition'>findMin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-737"></a><span class='hs-definition'>findMin</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-738"></a><span class='hs-definition'>findMin</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findMin</span> <span class='hs-varid'>l</span> <a name="line-739"></a><span class='hs-definition'>findMin</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Map.findMin: empty map has no minimal element"</span> <a name="line-740"></a> <a name="line-741"></a><span class='hs-comment'>-- | /O(log n)/. The maximal key of the map. Calls 'error' is the map is empty.</span> <a name="line-742"></a><span class='hs-comment'>--</span> <a name="line-743"></a><span class='hs-comment'>-- > findMax (fromList [(5,"a"), (3,"b")]) == (5,"a")</span> <a name="line-744"></a><span class='hs-comment'>-- > findMax empty Error: empty map has no maximal element</span> <a name="line-745"></a> <a name="line-746"></a><a name="findMax"></a><span class='hs-definition'>findMax</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-747"></a><span class='hs-definition'>findMax</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-748"></a><span class='hs-definition'>findMax</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>findMax</span> <span class='hs-varid'>r</span> <a name="line-749"></a><span class='hs-definition'>findMax</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Map.findMax: empty map has no maximal element"</span> <a name="line-750"></a> <a name="line-751"></a><span class='hs-comment'>-- | /O(log n)/. Delete the minimal key. Returns an empty map if the map is empty.</span> <a name="line-752"></a><span class='hs-comment'>--</span> <a name="line-753"></a><span class='hs-comment'>-- > deleteMin (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(5,"a"), (7,"c")]</span> <a name="line-754"></a><span class='hs-comment'>-- > deleteMin empty == empty</span> <a name="line-755"></a> <a name="line-756"></a><a name="deleteMin"></a><span class='hs-definition'>deleteMin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-757"></a><span class='hs-definition'>deleteMin</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <a name="line-758"></a><span class='hs-definition'>deleteMin</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>deleteMin</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-759"></a><span class='hs-definition'>deleteMin</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-760"></a> <a name="line-761"></a><span class='hs-comment'>-- | /O(log n)/. Delete the maximal key. Returns an empty map if the map is empty.</span> <a name="line-762"></a><span class='hs-comment'>--</span> <a name="line-763"></a><span class='hs-comment'>-- > deleteMax (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(3,"b"), (5,"a")]</span> <a name="line-764"></a><span class='hs-comment'>-- > deleteMax empty == empty</span> <a name="line-765"></a> <a name="line-766"></a><a name="deleteMax"></a><span class='hs-definition'>deleteMax</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-767"></a><span class='hs-definition'>deleteMax</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <a name="line-768"></a><span class='hs-definition'>deleteMax</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>deleteMax</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-769"></a><span class='hs-definition'>deleteMax</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-770"></a> <a name="line-771"></a><span class='hs-comment'>-- | /O(log n)/. Update the value at the minimal key.</span> <a name="line-772"></a><span class='hs-comment'>--</span> <a name="line-773"></a><span class='hs-comment'>-- > updateMin (\ a -> Just ("X" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3, "Xb"), (5, "a")]</span> <a name="line-774"></a><span class='hs-comment'>-- > updateMin (\ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span> <a name="line-775"></a> <a name="line-776"></a><a name="updateMin"></a><span class='hs-definition'>updateMin</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-777"></a><span class='hs-definition'>updateMin</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <a name="line-778"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateMinWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span> <a name="line-779"></a> <a name="line-780"></a><span class='hs-comment'>-- | /O(log n)/. Update the value at the maximal key.</span> <a name="line-781"></a><span class='hs-comment'>--</span> <a name="line-782"></a><span class='hs-comment'>-- > updateMax (\ a -> Just ("X" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "Xa")]</span> <a name="line-783"></a><span class='hs-comment'>-- > updateMax (\ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span> <a name="line-784"></a> <a name="line-785"></a><a name="updateMax"></a><span class='hs-definition'>updateMax</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-786"></a><span class='hs-definition'>updateMax</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <a name="line-787"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateMaxWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span> <a name="line-788"></a> <a name="line-789"></a> <a name="line-790"></a><span class='hs-comment'>-- | /O(log n)/. Update the value at the minimal key.</span> <a name="line-791"></a><span class='hs-comment'>--</span> <a name="line-792"></a><span class='hs-comment'>-- > updateMinWithKey (\ k a -> Just ((show k) ++ ":" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3,"3:b"), (5,"a")]</span> <a name="line-793"></a><span class='hs-comment'>-- > updateMinWithKey (\ _ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span> <a name="line-794"></a> <a name="line-795"></a><a name="updateMinWithKey"></a><span class='hs-definition'>updateMinWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-796"></a><span class='hs-definition'>updateMinWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-797"></a> <span class='hs-keyword'>where</span> <a name="line-798"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-799"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>r</span> <a name="line-800"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>r</span> <a name="line-801"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-802"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-803"></a> <a name="line-804"></a><span class='hs-comment'>-- | /O(log n)/. Update the value at the maximal key.</span> <a name="line-805"></a><span class='hs-comment'>--</span> <a name="line-806"></a><span class='hs-comment'>-- > updateMaxWithKey (\ k a -> Just ((show k) ++ ":" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3,"b"), (5,"5:a")]</span> <a name="line-807"></a><span class='hs-comment'>-- > updateMaxWithKey (\ _ _ -> Nothing) (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span> <a name="line-808"></a> <a name="line-809"></a><a name="updateMaxWithKey"></a><span class='hs-definition'>updateMaxWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-810"></a><span class='hs-definition'>updateMaxWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-811"></a> <span class='hs-keyword'>where</span> <a name="line-812"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-813"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>l</span> <a name="line-814"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Tip</span> <a name="line-815"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-816"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-817"></a> <a name="line-818"></a><span class='hs-comment'>-- | /O(log n)/. Retrieves the minimal (key,value) pair of the map, and</span> <a name="line-819"></a><span class='hs-comment'>-- the map stripped of that element, or 'Nothing' if passed an empty map.</span> <a name="line-820"></a><span class='hs-comment'>--</span> <a name="line-821"></a><span class='hs-comment'>-- > minViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((3,"b"), singleton 5 "a")</span> <a name="line-822"></a><span class='hs-comment'>-- > minViewWithKey empty == Nothing</span> <a name="line-823"></a> <a name="line-824"></a><a name="minViewWithKey"></a><span class='hs-definition'>minViewWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-825"></a><span class='hs-definition'>minViewWithKey</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> <a name="line-826"></a><span class='hs-definition'>minViewWithKey</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>deleteFindMin</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-827"></a> <a name="line-828"></a><span class='hs-comment'>-- | /O(log n)/. Retrieves the maximal (key,value) pair of the map, and</span> <a name="line-829"></a><span class='hs-comment'>-- the map stripped of that element, or 'Nothing' if passed an empty map.</span> <a name="line-830"></a><span class='hs-comment'>--</span> <a name="line-831"></a><span class='hs-comment'>-- > maxViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((5,"a"), singleton 3 "b")</span> <a name="line-832"></a><span class='hs-comment'>-- > maxViewWithKey empty == Nothing</span> <a name="line-833"></a> <a name="line-834"></a><a name="maxViewWithKey"></a><span class='hs-definition'>maxViewWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-835"></a><span class='hs-definition'>maxViewWithKey</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> <a name="line-836"></a><span class='hs-definition'>maxViewWithKey</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>deleteFindMax</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-837"></a> <a name="line-838"></a><span class='hs-comment'>-- | /O(log n)/. Retrieves the value associated with minimal key of the</span> <a name="line-839"></a><span class='hs-comment'>-- map, and the map stripped of that element, or 'Nothing' if passed an</span> <a name="line-840"></a><span class='hs-comment'>-- empty map.</span> <a name="line-841"></a><span class='hs-comment'>--</span> <a name="line-842"></a><span class='hs-comment'>-- > minView (fromList [(5,"a"), (3,"b")]) == Just ("b", singleton 5 "a")</span> <a name="line-843"></a><span class='hs-comment'>-- > minView empty == Nothing</span> <a name="line-844"></a> <a name="line-845"></a><a name="minView"></a><span class='hs-definition'>minView</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-846"></a><span class='hs-definition'>minView</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> <a name="line-847"></a><span class='hs-definition'>minView</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>first</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>$</span> <span class='hs-varid'>deleteFindMin</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-848"></a> <a name="line-849"></a><span class='hs-comment'>-- | /O(log n)/. Retrieves the value associated with maximal key of the</span> <a name="line-850"></a><span class='hs-comment'>-- map, and the map stripped of that element, or 'Nothing' if passed an</span> <a name="line-851"></a><span class='hs-comment'>--</span> <a name="line-852"></a><span class='hs-comment'>-- > maxView (fromList [(5,"a"), (3,"b")]) == Just ("a", singleton 3 "b")</span> <a name="line-853"></a><span class='hs-comment'>-- > maxView empty == Nothing</span> <a name="line-854"></a> <a name="line-855"></a><a name="maxView"></a><span class='hs-definition'>maxView</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-856"></a><span class='hs-definition'>maxView</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span> <a name="line-857"></a><span class='hs-definition'>maxView</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>first</span> <span class='hs-varid'>snd</span> <span class='hs-varop'>$</span> <span class='hs-varid'>deleteFindMax</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-858"></a> <a name="line-859"></a><a name="first"></a><span class='hs-comment'>-- Update the 1st component of a tuple (special case of Control.Arrow.first)</span> <a name="line-860"></a><span class='hs-definition'>first</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-861"></a><span class='hs-definition'>first</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <a name="line-862"></a> <a name="line-863"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-864"></a> Union. <a name="line-865"></a>--------------------------------------------------------------------}</span> <a name="line-866"></a><span class='hs-comment'>-- | The union of a list of maps:</span> <a name="line-867"></a><span class='hs-comment'>-- (@'unions' == 'Prelude.foldl' 'union' 'empty'@).</span> <a name="line-868"></a><span class='hs-comment'>--</span> <a name="line-869"></a><span class='hs-comment'>-- > unions [(fromList [(5, "a"), (3, "b")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "A3"), (3, "B3")])]</span> <a name="line-870"></a><span class='hs-comment'>-- > == fromList [(3, "b"), (5, "a"), (7, "C")]</span> <a name="line-871"></a><span class='hs-comment'>-- > unions [(fromList [(5, "A3"), (3, "B3")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "a"), (3, "b")])]</span> <a name="line-872"></a><span class='hs-comment'>-- > == fromList [(3, "B3"), (5, "A3"), (7, "C")]</span> <a name="line-873"></a> <a name="line-874"></a><a name="unions"></a><span class='hs-definition'>unions</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-875"></a><span class='hs-definition'>unions</span> <span class='hs-varid'>ts</span> <a name="line-876"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldlStrict</span> <span class='hs-varid'>union</span> <span class='hs-varid'>empty</span> <span class='hs-varid'>ts</span> <a name="line-877"></a> <a name="line-878"></a><span class='hs-comment'>-- | The union of a list of maps, with a combining operation:</span> <a name="line-879"></a><span class='hs-comment'>-- (@'unionsWith' f == 'Prelude.foldl' ('unionWith' f) 'empty'@).</span> <a name="line-880"></a><span class='hs-comment'>--</span> <a name="line-881"></a><span class='hs-comment'>-- > unionsWith (++) [(fromList [(5, "a"), (3, "b")]), (fromList [(5, "A"), (7, "C")]), (fromList [(5, "A3"), (3, "B3")])]</span> <a name="line-882"></a><span class='hs-comment'>-- > == fromList [(3, "bB3"), (5, "aAA3"), (7, "C")]</span> <a name="line-883"></a> <a name="line-884"></a><a name="unionsWith"></a><span class='hs-definition'>unionsWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>-></span><span class='hs-varid'>a</span><span class='hs-keyglyph'>-></span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-885"></a><span class='hs-definition'>unionsWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ts</span> <a name="line-886"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldlStrict</span> <span class='hs-layout'>(</span><span class='hs-varid'>unionWith</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varid'>empty</span> <span class='hs-varid'>ts</span> <a name="line-887"></a> <a name="line-888"></a><span class='hs-comment'>-- | /O(n+m)/.</span> <a name="line-889"></a><span class='hs-comment'>-- The expression (@'union' t1 t2@) takes the left-biased union of @t1@ and @t2@. </span> <a name="line-890"></a><span class='hs-comment'>-- It prefers @t1@ when duplicate keys are encountered,</span> <a name="line-891"></a><span class='hs-comment'>-- i.e. (@'union' == 'unionWith' 'const'@).</span> <a name="line-892"></a><span class='hs-comment'>-- The implementation uses the efficient /hedge-union/ algorithm.</span> <a name="line-893"></a><span class='hs-comment'>-- Hedge-union is more efficient on (bigset \``union`\` smallset).</span> <a name="line-894"></a><span class='hs-comment'>--</span> <a name="line-895"></a><span class='hs-comment'>-- > union (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "a"), (7, "C")]</span> <a name="line-896"></a> <a name="line-897"></a><a name="union"></a><span class='hs-definition'>union</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-898"></a><span class='hs-definition'>union</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t2</span> <a name="line-899"></a><span class='hs-definition'>union</span> <span class='hs-varid'>t1</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t1</span> <a name="line-900"></a><span class='hs-definition'>union</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hedgeUnionL</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>LT</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>GT</span><span class='hs-layout'>)</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <a name="line-901"></a> <a name="line-902"></a><a name="hedgeUnionL"></a><span class='hs-comment'>-- left-biased hedge union</span> <a name="line-903"></a><span class='hs-definition'>hedgeUnionL</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <a name="line-904"></a> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-905"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-906"></a><span class='hs-definition'>hedgeUnionL</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>t1</span> <span class='hs-conid'>Tip</span> <a name="line-907"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t1</span> <a name="line-908"></a><span class='hs-definition'>hedgeUnionL</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-conid'>Tip</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-909"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterGt</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterLt</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-910"></a><span class='hs-definition'>hedgeUnionL</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>t2</span> <a name="line-911"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>hedgeUnionL</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>trim</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-912"></a> <span class='hs-layout'>(</span><span class='hs-varid'>hedgeUnionL</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-varid'>trim</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-913"></a> <span class='hs-keyword'>where</span> <a name="line-914"></a> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>k</span> <a name="line-915"></a> <a name="line-916"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-917"></a> Union with a combining function <a name="line-918"></a>--------------------------------------------------------------------}</span> <a name="line-919"></a><span class='hs-comment'>-- | /O(n+m)/. Union with a combining function. The implementation uses the efficient /hedge-union/ algorithm.</span> <a name="line-920"></a><span class='hs-comment'>--</span> <a name="line-921"></a><span class='hs-comment'>-- > unionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "aA"), (7, "C")]</span> <a name="line-922"></a> <a name="line-923"></a><a name="unionWith"></a><span class='hs-definition'>unionWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-924"></a><span class='hs-definition'>unionWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-925"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unionWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-926"></a> <a name="line-927"></a><span class='hs-comment'>-- | /O(n+m)/.</span> <a name="line-928"></a><span class='hs-comment'>-- Union with a combining function. The implementation uses the efficient /hedge-union/ algorithm.</span> <a name="line-929"></a><span class='hs-comment'>-- Hedge-union is more efficient on (bigset \``union`\` smallset).</span> <a name="line-930"></a><span class='hs-comment'>--</span> <a name="line-931"></a><span class='hs-comment'>-- > let f key left_value right_value = (show key) ++ ":" ++ left_value ++ "|" ++ right_value</span> <a name="line-932"></a><span class='hs-comment'>-- > unionWithKey f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == fromList [(3, "b"), (5, "5:a|A"), (7, "C")]</span> <a name="line-933"></a> <a name="line-934"></a><a name="unionWithKey"></a><span class='hs-definition'>unionWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-935"></a><span class='hs-definition'>unionWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t2</span> <a name="line-936"></a><span class='hs-definition'>unionWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>t1</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t1</span> <a name="line-937"></a><span class='hs-definition'>unionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hedgeUnionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>LT</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>GT</span><span class='hs-layout'>)</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <a name="line-938"></a> <a name="line-939"></a><a name="hedgeUnionWithKey"></a><span class='hs-definition'>hedgeUnionWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <a name="line-940"></a> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <a name="line-941"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <a name="line-942"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-943"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-944"></a><span class='hs-definition'>hedgeUnionWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>t1</span> <span class='hs-conid'>Tip</span> <a name="line-945"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t1</span> <a name="line-946"></a><span class='hs-definition'>hedgeUnionWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-conid'>Tip</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-947"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterGt</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterLt</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-948"></a><span class='hs-definition'>hedgeUnionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>t2</span> <a name="line-949"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>newx</span> <span class='hs-layout'>(</span><span class='hs-varid'>hedgeUnionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>l</span> <span class='hs-varid'>lt</span><span class='hs-layout'>)</span> <a name="line-950"></a> <span class='hs-layout'>(</span><span class='hs-varid'>hedgeUnionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span> <span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <a name="line-951"></a> <span class='hs-keyword'>where</span> <a name="line-952"></a> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>k</span> <a name="line-953"></a> <span class='hs-varid'>lt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>trim</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>t2</span> <a name="line-954"></a> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>trimLookupLo</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t2</span> <a name="line-955"></a> <span class='hs-varid'>newx</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>found</span> <span class='hs-keyword'>of</span> <a name="line-956"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>x</span> <a name="line-957"></a> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <a name="line-958"></a> <a name="line-959"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-960"></a> Difference <a name="line-961"></a>--------------------------------------------------------------------}</span> <a name="line-962"></a><span class='hs-comment'>-- | /O(n+m)/. Difference of two maps. </span> <a name="line-963"></a><span class='hs-comment'>-- Return elements of the first map not existing in the second map.</span> <a name="line-964"></a><span class='hs-comment'>-- The implementation uses an efficient /hedge/ algorithm comparable with /hedge-union/.</span> <a name="line-965"></a><span class='hs-comment'>--</span> <a name="line-966"></a><span class='hs-comment'>-- > difference (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 3 "b"</span> <a name="line-967"></a> <a name="line-968"></a><a name="difference"></a><span class='hs-definition'>difference</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-969"></a><span class='hs-definition'>difference</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-970"></a><span class='hs-definition'>difference</span> <span class='hs-varid'>t1</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t1</span> <a name="line-971"></a><span class='hs-definition'>difference</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hedgeDiff</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>LT</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>GT</span><span class='hs-layout'>)</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <a name="line-972"></a> <a name="line-973"></a><a name="hedgeDiff"></a><span class='hs-definition'>hedgeDiff</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <a name="line-974"></a> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <a name="line-975"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-976"></a><span class='hs-definition'>hedgeDiff</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <a name="line-977"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-978"></a><span class='hs-definition'>hedgeDiff</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-conid'>Tip</span> <a name="line-979"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterGt</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterLt</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-980"></a><span class='hs-definition'>hedgeDiff</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-981"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>merge</span> <span class='hs-layout'>(</span><span class='hs-varid'>hedgeDiff</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-layout'>(</span><span class='hs-varid'>trim</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <a name="line-982"></a> <span class='hs-layout'>(</span><span class='hs-varid'>hedgeDiff</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>cmphi</span> <span class='hs-layout'>(</span><span class='hs-varid'>trim</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-983"></a> <span class='hs-keyword'>where</span> <a name="line-984"></a> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>k</span> <a name="line-985"></a> <a name="line-986"></a><span class='hs-comment'>-- | /O(n+m)/. Difference with a combining function. </span> <a name="line-987"></a><span class='hs-comment'>-- When two equal keys are</span> <a name="line-988"></a><span class='hs-comment'>-- encountered, the combining function is applied to the values of these keys.</span> <a name="line-989"></a><span class='hs-comment'>-- If it returns 'Nothing', the element is discarded (proper set difference). If</span> <a name="line-990"></a><span class='hs-comment'>-- it returns (@'Just' y@), the element is updated with a new value @y@. </span> <a name="line-991"></a><span class='hs-comment'>-- The implementation uses an efficient /hedge/ algorithm comparable with /hedge-union/.</span> <a name="line-992"></a><span class='hs-comment'>--</span> <a name="line-993"></a><span class='hs-comment'>-- > let f al ar = if al == "b" then Just (al ++ ":" ++ ar) else Nothing</span> <a name="line-994"></a><span class='hs-comment'>-- > differenceWith f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (3, "B"), (7, "C")])</span> <a name="line-995"></a><span class='hs-comment'>-- > == singleton 3 "b:B"</span> <a name="line-996"></a> <a name="line-997"></a><a name="differenceWith"></a><span class='hs-definition'>differenceWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-998"></a><span class='hs-definition'>differenceWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-999"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>differenceWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1000"></a> <a name="line-1001"></a><span class='hs-comment'>-- | /O(n+m)/. Difference with a combining function. When two equal keys are</span> <a name="line-1002"></a><span class='hs-comment'>-- encountered, the combining function is applied to the key and both values.</span> <a name="line-1003"></a><span class='hs-comment'>-- If it returns 'Nothing', the element is discarded (proper set difference). If</span> <a name="line-1004"></a><span class='hs-comment'>-- it returns (@'Just' y@), the element is updated with a new value @y@. </span> <a name="line-1005"></a><span class='hs-comment'>-- The implementation uses an efficient /hedge/ algorithm comparable with /hedge-union/.</span> <a name="line-1006"></a><span class='hs-comment'>--</span> <a name="line-1007"></a><span class='hs-comment'>-- > let f k al ar = if al == "b" then Just ((show k) ++ ":" ++ al ++ "|" ++ ar) else Nothing</span> <a name="line-1008"></a><span class='hs-comment'>-- > differenceWithKey f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (3, "B"), (10, "C")])</span> <a name="line-1009"></a><span class='hs-comment'>-- > == singleton 3 "3:b|B"</span> <a name="line-1010"></a> <a name="line-1011"></a><a name="differenceWithKey"></a><span class='hs-definition'>differenceWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1012"></a><span class='hs-definition'>differenceWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1013"></a><span class='hs-definition'>differenceWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>t1</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t1</span> <a name="line-1014"></a><span class='hs-definition'>differenceWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hedgeDiffWithKey</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>LT</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>GT</span><span class='hs-layout'>)</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <a name="line-1015"></a> <a name="line-1016"></a><a name="hedgeDiffWithKey"></a><span class='hs-definition'>hedgeDiffWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <a name="line-1017"></a> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <a name="line-1018"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <a name="line-1019"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <a name="line-1020"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-1021"></a><span class='hs-definition'>hedgeDiffWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <a name="line-1022"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1023"></a><span class='hs-definition'>hedgeDiffWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-conid'>Tip</span> <a name="line-1024"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterGt</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>filterLt</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1025"></a><span class='hs-definition'>hedgeDiffWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1026"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>found</span> <span class='hs-keyword'>of</span> <a name="line-1027"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>merge</span> <span class='hs-varid'>tl</span> <span class='hs-varid'>tr</span> <a name="line-1028"></a> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>ky</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <a name="line-1029"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-1030"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>merge</span> <span class='hs-varid'>tl</span> <span class='hs-varid'>tr</span> <a name="line-1031"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>join</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>z</span> <span class='hs-varid'>tl</span> <span class='hs-varid'>tr</span> <a name="line-1032"></a> <span class='hs-keyword'>where</span> <a name="line-1033"></a> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>k</span> <a name="line-1034"></a> <span class='hs-varid'>lt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>trim</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>t</span> <a name="line-1035"></a> <span class='hs-layout'>(</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>trimLookupLo</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t</span> <a name="line-1036"></a> <span class='hs-varid'>tl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hedgeDiffWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>lt</span> <span class='hs-varid'>l</span> <a name="line-1037"></a> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hedgeDiffWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>cmpkx</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>gt</span> <span class='hs-varid'>r</span> <a name="line-1038"></a> <a name="line-1039"></a> <a name="line-1040"></a> <a name="line-1041"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1042"></a> Intersection <a name="line-1043"></a>--------------------------------------------------------------------}</span> <a name="line-1044"></a><span class='hs-comment'>-- | /O(n+m)/. Intersection of two maps.</span> <a name="line-1045"></a><span class='hs-comment'>-- Return data in the first map for the keys existing in both maps.</span> <a name="line-1046"></a><span class='hs-comment'>-- (@'intersection' m1 m2 == 'intersectionWith' 'const' m1 m2@).</span> <a name="line-1047"></a><span class='hs-comment'>--</span> <a name="line-1048"></a><span class='hs-comment'>-- > intersection (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "a"</span> <a name="line-1049"></a> <a name="line-1050"></a><a name="intersection"></a><span class='hs-definition'>intersection</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1051"></a><span class='hs-definition'>intersection</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1052"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectionWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1053"></a> <a name="line-1054"></a><span class='hs-comment'>-- | /O(n+m)/. Intersection with a combining function.</span> <a name="line-1055"></a><span class='hs-comment'>--</span> <a name="line-1056"></a><span class='hs-comment'>-- > intersectionWith (++) (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "aA"</span> <a name="line-1057"></a> <a name="line-1058"></a><a name="intersectionWith"></a><span class='hs-definition'>intersectionWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <a name="line-1059"></a><span class='hs-definition'>intersectionWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1060"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectionWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1061"></a> <a name="line-1062"></a><span class='hs-comment'>-- | /O(n+m)/. Intersection with a combining function.</span> <a name="line-1063"></a><span class='hs-comment'>-- Intersection is more efficient on (bigset \``intersection`\` smallset).</span> <a name="line-1064"></a><span class='hs-comment'>--</span> <a name="line-1065"></a><span class='hs-comment'>-- > let f k al ar = (show k) ++ ":" ++ al ++ "|" ++ ar</span> <a name="line-1066"></a><span class='hs-comment'>-- > intersectionWithKey f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (7, "C")]) == singleton 5 "5:a|A"</span> <a name="line-1067"></a> <a name="line-1068"></a><span class='hs-comment'>--intersectionWithKey :: Ord k => (k -> a -> b -> c) -> Map k a -> Map k b -> Map k c</span> <a name="line-1069"></a><span class='hs-comment'>--intersectionWithKey f Tip t = Tip</span> <a name="line-1070"></a><span class='hs-comment'>--intersectionWithKey f t Tip = Tip</span> <a name="line-1071"></a><span class='hs-comment'>--intersectionWithKey f t1 t2 = intersectWithKey f t1 t2</span> <a name="line-1072"></a><span class='hs-comment'>--</span> <a name="line-1073"></a><span class='hs-comment'>--intersectWithKey f Tip t = Tip</span> <a name="line-1074"></a><span class='hs-comment'>--intersectWithKey f t Tip = Tip</span> <a name="line-1075"></a><span class='hs-comment'>--intersectWithKey f t (Bin _ kx x l r)</span> <a name="line-1076"></a><span class='hs-comment'>-- = case found of</span> <a name="line-1077"></a><span class='hs-comment'>-- Nothing -> merge tl tr</span> <a name="line-1078"></a><span class='hs-comment'>-- Just y -> join kx (f kx y x) tl tr</span> <a name="line-1079"></a><span class='hs-comment'>-- where</span> <a name="line-1080"></a><span class='hs-comment'>-- (lt,found,gt) = splitLookup kx t</span> <a name="line-1081"></a><span class='hs-comment'>-- tl = intersectWithKey f lt l</span> <a name="line-1082"></a><span class='hs-comment'>-- tr = intersectWithKey f gt r</span> <a name="line-1083"></a> <a name="line-1084"></a><a name="intersectionWithKey"></a><span class='hs-definition'>intersectionWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span> <a name="line-1085"></a><span class='hs-definition'>intersectionWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1086"></a><span class='hs-definition'>intersectionWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1087"></a><span class='hs-definition'>intersectionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t1</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>s1</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>)</span> <span class='hs-varid'>t2</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>s2</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-1088"></a> <span class='hs-keyword'>if</span> <span class='hs-varid'>s1</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>s2</span> <span class='hs-keyword'>then</span> <a name="line-1089"></a> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitLookupWithKey</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>t1</span> <a name="line-1090"></a> <span class='hs-varid'>tl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>lt</span> <span class='hs-varid'>l2</span> <a name="line-1091"></a> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>gt</span> <span class='hs-varid'>r2</span> <a name="line-1092"></a> <span class='hs-keyword'>in</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>found</span> <span class='hs-keyword'>of</span> <a name="line-1093"></a> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>join</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>x2</span><span class='hs-layout'>)</span> <span class='hs-varid'>tl</span> <span class='hs-varid'>tr</span> <a name="line-1094"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>merge</span> <span class='hs-varid'>tl</span> <span class='hs-varid'>tr</span> <a name="line-1095"></a> <span class='hs-keyword'>else</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitLookup</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>t2</span> <a name="line-1096"></a> <span class='hs-varid'>tl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>lt</span> <a name="line-1097"></a> <span class='hs-varid'>tr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intersectionWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r1</span> <span class='hs-varid'>gt</span> <a name="line-1098"></a> <span class='hs-keyword'>in</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>found</span> <span class='hs-keyword'>of</span> <a name="line-1099"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>join</span> <span class='hs-varid'>k1</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>tl</span> <span class='hs-varid'>tr</span> <a name="line-1100"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>merge</span> <span class='hs-varid'>tl</span> <span class='hs-varid'>tr</span> <a name="line-1101"></a> <a name="line-1102"></a> <a name="line-1103"></a> <a name="line-1104"></a><a name="isSubmapOf"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1105"></a> Submap <a name="line-1106"></a>--------------------------------------------------------------------}</span> <a name="line-1107"></a><span class='hs-comment'>-- | /O(n+m)/.</span> <a name="line-1108"></a><span class='hs-comment'>-- This function is defined as (@'isSubmapOf' = 'isSubmapOfBy' (==)@).</span> <a name="line-1109"></a><span class='hs-comment'>--</span> <a name="line-1110"></a><span class='hs-definition'>isSubmapOf</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-1111"></a><span class='hs-definition'>isSubmapOf</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isSubmapOfBy</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1112"></a> <a name="line-1113"></a><a name="isSubmapOfBy"></a><span class='hs-comment'>{- | /O(n+m)/. <a name="line-1114"></a> The expression (@'isSubmapOfBy' f t1 t2@) returns 'True' if <a name="line-1115"></a> all keys in @t1@ are in tree @t2@, and when @f@ returns 'True' when <a name="line-1116"></a> applied to their respective values. For example, the following <a name="line-1117"></a> expressions are all 'True': <a name="line-1118"></a> <a name="line-1119"></a> > isSubmapOfBy (==) (fromList [('a',1)]) (fromList [('a',1),('b',2)]) <a name="line-1120"></a> > isSubmapOfBy (<=) (fromList [('a',1)]) (fromList [('a',1),('b',2)]) <a name="line-1121"></a> > isSubmapOfBy (==) (fromList [('a',1),('b',2)]) (fromList [('a',1),('b',2)]) <a name="line-1122"></a> <a name="line-1123"></a> But the following are all 'False': <a name="line-1124"></a> <a name="line-1125"></a> > isSubmapOfBy (==) (fromList [('a',2)]) (fromList [('a',1),('b',2)]) <a name="line-1126"></a> > isSubmapOfBy (<) (fromList [('a',1)]) (fromList [('a',1),('b',2)]) <a name="line-1127"></a> > isSubmapOfBy (==) (fromList [('a',1),('b',2)]) (fromList [('a',1)]) <a name="line-1128"></a> <a name="line-1129"></a> <a name="line-1130"></a>-}</span> <a name="line-1131"></a><span class='hs-definition'>isSubmapOfBy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>-></span><span class='hs-varid'>b</span><span class='hs-keyglyph'>-></span><span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-1132"></a><span class='hs-definition'>isSubmapOfBy</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <a name="line-1133"></a> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span> <span class='hs-varid'>t1</span> <span class='hs-varop'><=</span> <span class='hs-varid'>size</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&&</span> <span class='hs-layout'>(</span><span class='hs-varid'>submap'</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <a name="line-1134"></a> <a name="line-1135"></a><a name="submap'"></a><span class='hs-definition'>submap'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-1136"></a><span class='hs-definition'>submap'</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-1137"></a><span class='hs-definition'>submap'</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-1138"></a><span class='hs-definition'>submap'</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span> <a name="line-1139"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>found</span> <span class='hs-keyword'>of</span> <a name="line-1140"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>False</span> <a name="line-1141"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>submap'</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l</span> <span class='hs-varid'>lt</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>submap'</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <span class='hs-varid'>gt</span> <a name="line-1142"></a> <span class='hs-keyword'>where</span> <a name="line-1143"></a> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>found</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitLookup</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>t</span> <a name="line-1144"></a> <a name="line-1145"></a><a name="isProperSubmapOf"></a><span class='hs-comment'>-- | /O(n+m)/. Is this a proper submap? (ie. a submap but not equal). </span> <a name="line-1146"></a><span class='hs-comment'>-- Defined as (@'isProperSubmapOf' = 'isProperSubmapOfBy' (==)@).</span> <a name="line-1147"></a><span class='hs-definition'>isProperSubmapOf</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-1148"></a><span class='hs-definition'>isProperSubmapOf</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1149"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isProperSubmapOfBy</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <a name="line-1150"></a> <a name="line-1151"></a><a name="isProperSubmapOfBy"></a><span class='hs-comment'>{- | /O(n+m)/. Is this a proper submap? (ie. a submap but not equal). <a name="line-1152"></a> The expression (@'isProperSubmapOfBy' f m1 m2@) returns 'True' when <a name="line-1153"></a> @m1@ and @m2@ are not equal, <a name="line-1154"></a> all keys in @m1@ are in @m2@, and when @f@ returns 'True' when <a name="line-1155"></a> applied to their respective values. For example, the following <a name="line-1156"></a> expressions are all 'True': <a name="line-1157"></a> <a name="line-1158"></a> > isProperSubmapOfBy (==) (fromList [(1,1)]) (fromList [(1,1),(2,2)]) <a name="line-1159"></a> > isProperSubmapOfBy (<=) (fromList [(1,1)]) (fromList [(1,1),(2,2)]) <a name="line-1160"></a> <a name="line-1161"></a> But the following are all 'False': <a name="line-1162"></a> <a name="line-1163"></a> > isProperSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1),(2,2)]) <a name="line-1164"></a> > isProperSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1)]) <a name="line-1165"></a> > isProperSubmapOfBy (<) (fromList [(1,1)]) (fromList [(1,1),(2,2)]) <a name="line-1166"></a> <a name="line-1167"></a> <a name="line-1168"></a>-}</span> <a name="line-1169"></a><span class='hs-definition'>isProperSubmapOfBy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-1170"></a><span class='hs-definition'>isProperSubmapOfBy</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span> <a name="line-1171"></a> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span> <span class='hs-varid'>t1</span> <span class='hs-varop'><</span> <span class='hs-varid'>size</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&&</span> <span class='hs-layout'>(</span><span class='hs-varid'>submap'</span> <span class='hs-varid'>f</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <a name="line-1172"></a> <a name="line-1173"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1174"></a> Filter and partition <a name="line-1175"></a>--------------------------------------------------------------------}</span> <a name="line-1176"></a><span class='hs-comment'>-- | /O(n)/. Filter all values that satisfy the predicate.</span> <a name="line-1177"></a><span class='hs-comment'>--</span> <a name="line-1178"></a><span class='hs-comment'>-- > filter (> "a") (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span> <a name="line-1179"></a><span class='hs-comment'>-- > filter (> "x") (fromList [(5,"a"), (3,"b")]) == empty</span> <a name="line-1180"></a><span class='hs-comment'>-- > filter (< "a") (fromList [(5,"a"), (3,"b")]) == empty</span> <a name="line-1181"></a> <a name="line-1182"></a><a name="filter"></a><span class='hs-definition'>filter</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1183"></a><span class='hs-definition'>filter</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <a name="line-1184"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filterWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>p</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span> <a name="line-1185"></a> <a name="line-1186"></a><span class='hs-comment'>-- | /O(n)/. Filter all keys\/values that satisfy the predicate.</span> <a name="line-1187"></a><span class='hs-comment'>--</span> <a name="line-1188"></a><span class='hs-comment'>-- > filterWithKey (\k _ -> k > 4) (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span> <a name="line-1189"></a> <a name="line-1190"></a><a name="filterWithKey"></a><span class='hs-definition'>filterWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1191"></a><span class='hs-definition'>filterWithKey</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1192"></a> <span class='hs-keyword'>where</span> <a name="line-1193"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1194"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1195"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>p</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1196"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>merge</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1197"></a> <a name="line-1198"></a><span class='hs-comment'>-- | /O(n)/. Partition the map according to a predicate. The first</span> <a name="line-1199"></a><span class='hs-comment'>-- map contains all elements that satisfy the predicate, the second all</span> <a name="line-1200"></a><span class='hs-comment'>-- elements that fail the predicate. See also 'split'.</span> <a name="line-1201"></a><span class='hs-comment'>--</span> <a name="line-1202"></a><span class='hs-comment'>-- > partition (> "a") (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", singleton 5 "a")</span> <a name="line-1203"></a><span class='hs-comment'>-- > partition (< "x") (fromList [(5,"a"), (3,"b")]) == (fromList [(3, "b"), (5, "a")], empty)</span> <a name="line-1204"></a><span class='hs-comment'>-- > partition (> "x") (fromList [(5,"a"), (3,"b")]) == (empty, fromList [(3, "b"), (5, "a")])</span> <a name="line-1205"></a> <a name="line-1206"></a><a name="partition"></a><span class='hs-definition'>partition</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1207"></a><span class='hs-definition'>partition</span> <span class='hs-varid'>p</span> <span class='hs-varid'>m</span> <a name="line-1208"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>partitionWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>p</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span> <a name="line-1209"></a> <a name="line-1210"></a><span class='hs-comment'>-- | /O(n)/. Partition the map according to a predicate. The first</span> <a name="line-1211"></a><span class='hs-comment'>-- map contains all elements that satisfy the predicate, the second all</span> <a name="line-1212"></a><span class='hs-comment'>-- elements that fail the predicate. See also 'split'.</span> <a name="line-1213"></a><span class='hs-comment'>--</span> <a name="line-1214"></a><span class='hs-comment'>-- > partitionWithKey (\ k _ -> k > 3) (fromList [(5,"a"), (3,"b")]) == (singleton 5 "a", singleton 3 "b")</span> <a name="line-1215"></a><span class='hs-comment'>-- > partitionWithKey (\ k _ -> k < 7) (fromList [(5,"a"), (3,"b")]) == (fromList [(3, "b"), (5, "a")], empty)</span> <a name="line-1216"></a><span class='hs-comment'>-- > partitionWithKey (\ k _ -> k > 7) (fromList [(5,"a"), (3,"b")]) == (empty, fromList [(3, "b"), (5, "a")])</span> <a name="line-1217"></a> <a name="line-1218"></a><a name="partitionWithKey"></a><span class='hs-definition'>partitionWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1219"></a><span class='hs-definition'>partitionWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span><span class='hs-layout'>,</span><span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1220"></a><span class='hs-definition'>partitionWithKey</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1221"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>p</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>,</span><span class='hs-varid'>merge</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <a name="line-1222"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>merge</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>,</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <a name="line-1223"></a> <span class='hs-keyword'>where</span> <a name="line-1224"></a> <span class='hs-layout'>(</span><span class='hs-varid'>l1</span><span class='hs-layout'>,</span><span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>partitionWithKey</span> <span class='hs-varid'>p</span> <span class='hs-varid'>l</span> <a name="line-1225"></a> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span><span class='hs-layout'>,</span><span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>partitionWithKey</span> <span class='hs-varid'>p</span> <span class='hs-varid'>r</span> <a name="line-1226"></a> <a name="line-1227"></a><span class='hs-comment'>-- | /O(n)/. Map values and collect the 'Just' results.</span> <a name="line-1228"></a><span class='hs-comment'>--</span> <a name="line-1229"></a><span class='hs-comment'>-- > let f x = if x == "a" then Just "new a" else Nothing</span> <a name="line-1230"></a><span class='hs-comment'>-- > mapMaybe f (fromList [(5,"a"), (3,"b")]) == singleton 5 "new a"</span> <a name="line-1231"></a> <a name="line-1232"></a><a name="mapMaybe"></a><span class='hs-definition'>mapMaybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <a name="line-1233"></a><span class='hs-definition'>mapMaybe</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapMaybeWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-1234"></a> <a name="line-1235"></a><span class='hs-comment'>-- | /O(n)/. Map keys\/values and collect the 'Just' results.</span> <a name="line-1236"></a><span class='hs-comment'>--</span> <a name="line-1237"></a><span class='hs-comment'>-- > let f k _ = if k < 5 then Just ("key : " ++ (show k)) else Nothing</span> <a name="line-1238"></a><span class='hs-comment'>-- > mapMaybeWithKey f (fromList [(5,"a"), (3,"b")]) == singleton 3 "key : 3"</span> <a name="line-1239"></a> <a name="line-1240"></a><a name="mapMaybeWithKey"></a><span class='hs-definition'>mapMaybeWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <a name="line-1241"></a><span class='hs-definition'>mapMaybeWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1242"></a> <span class='hs-keyword'>where</span> <a name="line-1243"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1244"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-1245"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1246"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>merge</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1247"></a> <a name="line-1248"></a><span class='hs-comment'>-- | /O(n)/. Map values and separate the 'Left' and 'Right' results.</span> <a name="line-1249"></a><span class='hs-comment'>--</span> <a name="line-1250"></a><span class='hs-comment'>-- > let f a = if a < "c" then Left a else Right a</span> <a name="line-1251"></a><span class='hs-comment'>-- > mapEither f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span> <a name="line-1252"></a><span class='hs-comment'>-- > == (fromList [(3,"b"), (5,"a")], fromList [(1,"x"), (7,"z")])</span> <a name="line-1253"></a><span class='hs-comment'>-- ></span> <a name="line-1254"></a><span class='hs-comment'>-- > mapEither (\ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span> <a name="line-1255"></a><span class='hs-comment'>-- > == (empty, fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span> <a name="line-1256"></a> <a name="line-1257"></a><a name="mapEither"></a><span class='hs-definition'>mapEither</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Either</span> <span class='hs-varid'>b</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-1258"></a><span class='hs-definition'>mapEither</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <a name="line-1259"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapEitherWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>m</span> <a name="line-1260"></a> <a name="line-1261"></a><span class='hs-comment'>-- | /O(n)/. Map keys\/values and separate the 'Left' and 'Right' results.</span> <a name="line-1262"></a><span class='hs-comment'>--</span> <a name="line-1263"></a><span class='hs-comment'>-- > let f k a = if k < 5 then Left (k * 2) else Right (a ++ a)</span> <a name="line-1264"></a><span class='hs-comment'>-- > mapEitherWithKey f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span> <a name="line-1265"></a><span class='hs-comment'>-- > == (fromList [(1,2), (3,6)], fromList [(5,"aa"), (7,"zz")])</span> <a name="line-1266"></a><span class='hs-comment'>-- ></span> <a name="line-1267"></a><span class='hs-comment'>-- > mapEitherWithKey (\_ a -> Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span> <a name="line-1268"></a><span class='hs-comment'>-- > == (empty, fromList [(1,"x"), (3,"b"), (5,"a"), (7,"z")])</span> <a name="line-1269"></a> <a name="line-1270"></a><a name="mapEitherWithKey"></a><span class='hs-definition'>mapEitherWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <a name="line-1271"></a> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Either</span> <span class='hs-varid'>b</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-1272"></a><span class='hs-definition'>mapEitherWithKey</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span><span class='hs-layout'>,</span> <span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1273"></a><span class='hs-definition'>mapEitherWithKey</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <a name="line-1274"></a> <span class='hs-conid'>Left</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>,</span> <span class='hs-varid'>merge</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <a name="line-1275"></a> <span class='hs-conid'>Right</span> <span class='hs-varid'>z</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>merge</span> <span class='hs-varid'>l1</span> <span class='hs-varid'>r1</span><span class='hs-layout'>,</span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>z</span> <span class='hs-varid'>l2</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <a name="line-1276"></a> <span class='hs-keyword'>where</span> <a name="line-1277"></a> <span class='hs-layout'>(</span><span class='hs-varid'>l1</span><span class='hs-layout'>,</span><span class='hs-varid'>l2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapEitherWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l</span> <a name="line-1278"></a> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span><span class='hs-layout'>,</span><span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapEitherWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <a name="line-1279"></a> <a name="line-1280"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1281"></a> Mapping <a name="line-1282"></a>--------------------------------------------------------------------}</span> <a name="line-1283"></a><span class='hs-comment'>-- | /O(n)/. Map a function over all values in the map.</span> <a name="line-1284"></a><span class='hs-comment'>--</span> <a name="line-1285"></a><span class='hs-comment'>-- > map (++ "x") (fromList [(5,"a"), (3,"b")]) == fromList [(3, "bx"), (5, "ax")]</span> <a name="line-1286"></a> <a name="line-1287"></a><a name="map"></a><span class='hs-definition'>map</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <a name="line-1288"></a><span class='hs-definition'>map</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-1289"></a> <a name="line-1290"></a><span class='hs-comment'>-- | /O(n)/. Map a function over all values in the map.</span> <a name="line-1291"></a><span class='hs-comment'>--</span> <a name="line-1292"></a><span class='hs-comment'>-- > let f key x = (show key) ++ ":" ++ x</span> <a name="line-1293"></a><span class='hs-comment'>-- > mapWithKey f (fromList [(5,"a"), (3,"b")]) == fromList [(3, "3:b"), (5, "5:a")]</span> <a name="line-1294"></a> <a name="line-1295"></a><a name="mapWithKey"></a><span class='hs-definition'>mapWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <a name="line-1296"></a><span class='hs-definition'>mapWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1297"></a> <span class='hs-keyword'>where</span> <a name="line-1298"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1299"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1300"></a> <a name="line-1301"></a><span class='hs-comment'>-- | /O(n)/. The function 'mapAccum' threads an accumulating</span> <a name="line-1302"></a><span class='hs-comment'>-- argument through the map in ascending order of keys.</span> <a name="line-1303"></a><span class='hs-comment'>--</span> <a name="line-1304"></a><span class='hs-comment'>-- > let f a b = (a ++ b, b ++ "X")</span> <a name="line-1305"></a><span class='hs-comment'>-- > mapAccum f "Everything: " (fromList [(5,"a"), (3,"b")]) == ("Everything: ba", fromList [(3, "bX"), (5, "aX")])</span> <a name="line-1306"></a> <a name="line-1307"></a><a name="mapAccum"></a><span class='hs-definition'>mapAccum</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-1308"></a><span class='hs-definition'>mapAccum</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <a name="line-1309"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapAccumWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>a'</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>x'</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>x'</span><span class='hs-layout'>)</span> <span class='hs-varid'>a</span> <span class='hs-varid'>m</span> <a name="line-1310"></a> <a name="line-1311"></a><span class='hs-comment'>-- | /O(n)/. The function 'mapAccumWithKey' threads an accumulating</span> <a name="line-1312"></a><span class='hs-comment'>-- argument through the map in ascending order of keys.</span> <a name="line-1313"></a><span class='hs-comment'>--</span> <a name="line-1314"></a><span class='hs-comment'>-- > let f a k b = (a ++ " " ++ (show k) ++ "-" ++ b, b ++ "X")</span> <a name="line-1315"></a><span class='hs-comment'>-- > mapAccumWithKey f "Everything:" (fromList [(5,"a"), (3,"b")]) == ("Everything: 3-b 5-a", fromList [(3, "bX"), (5, "aX")])</span> <a name="line-1316"></a> <a name="line-1317"></a><a name="mapAccumWithKey"></a><span class='hs-definition'>mapAccumWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-1318"></a><span class='hs-definition'>mapAccumWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>t</span> <a name="line-1319"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapAccumL</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span> <span class='hs-varid'>t</span> <a name="line-1320"></a> <a name="line-1321"></a><a name="mapAccumL"></a><span class='hs-comment'>-- | /O(n)/. The function 'mapAccumL' threads an accumulating</span> <a name="line-1322"></a><span class='hs-comment'>-- argument throught the map in ascending order of keys.</span> <a name="line-1323"></a><span class='hs-definition'>mapAccumL</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-1324"></a><span class='hs-definition'>mapAccumL</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1325"></a> <span class='hs-keyword'>where</span> <a name="line-1326"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>a</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1327"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-1328"></a> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>a1</span><span class='hs-layout'>,</span><span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>a</span> <span class='hs-varid'>l</span> <a name="line-1329"></a> <span class='hs-layout'>(</span><span class='hs-varid'>a2</span><span class='hs-layout'>,</span><span class='hs-varid'>x'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a1</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <a name="line-1330"></a> <span class='hs-layout'>(</span><span class='hs-varid'>a3</span><span class='hs-layout'>,</span><span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>a2</span> <span class='hs-varid'>r</span> <a name="line-1331"></a> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>a3</span><span class='hs-layout'>,</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l'</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <a name="line-1332"></a> <a name="line-1333"></a><a name="mapAccumRWithKey"></a><span class='hs-comment'>-- | /O(n)/. The function 'mapAccumR' threads an accumulating</span> <a name="line-1334"></a><span class='hs-comment'>-- argument through the map in descending order of keys.</span> <a name="line-1335"></a><span class='hs-definition'>mapAccumRWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <a name="line-1336"></a><span class='hs-definition'>mapAccumRWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1337"></a> <span class='hs-keyword'>where</span> <a name="line-1338"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>a</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1339"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-1340"></a> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>a1</span><span class='hs-layout'>,</span><span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>a</span> <span class='hs-varid'>r</span> <a name="line-1341"></a> <span class='hs-layout'>(</span><span class='hs-varid'>a2</span><span class='hs-layout'>,</span><span class='hs-varid'>x'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a1</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <a name="line-1342"></a> <span class='hs-layout'>(</span><span class='hs-varid'>a3</span><span class='hs-layout'>,</span><span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>a2</span> <span class='hs-varid'>l</span> <a name="line-1343"></a> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>a3</span><span class='hs-layout'>,</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sx</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>l'</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <a name="line-1344"></a> <a name="line-1345"></a><span class='hs-comment'>-- | /O(n*log n)/.</span> <a name="line-1346"></a><span class='hs-comment'>-- @'mapKeys' f s@ is the map obtained by applying @f@ to each key of @s@.</span> <a name="line-1347"></a><span class='hs-comment'>-- </span> <a name="line-1348"></a><span class='hs-comment'>-- The size of the result may be smaller if @f@ maps two or more distinct</span> <a name="line-1349"></a><span class='hs-comment'>-- keys to the same new key. In this case the value at the smallest of</span> <a name="line-1350"></a><span class='hs-comment'>-- these keys is retained.</span> <a name="line-1351"></a><span class='hs-comment'>--</span> <a name="line-1352"></a><span class='hs-comment'>-- > mapKeys (+ 1) (fromList [(5,"a"), (3,"b")]) == fromList [(4, "b"), (6, "a")]</span> <a name="line-1353"></a><span class='hs-comment'>-- > mapKeys (\ _ -> 1) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 1 "c"</span> <a name="line-1354"></a><span class='hs-comment'>-- > mapKeys (\ _ -> 3) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 3 "c"</span> <a name="line-1355"></a> <a name="line-1356"></a><a name="mapKeys"></a><span class='hs-definition'>mapKeys</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k2</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k1</span><span class='hs-keyglyph'>-></span><span class='hs-varid'>k2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>a</span> <a name="line-1357"></a><span class='hs-definition'>mapKeys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapKeysWith</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <a name="line-1358"></a> <a name="line-1359"></a><span class='hs-comment'>-- | /O(n*log n)/.</span> <a name="line-1360"></a><span class='hs-comment'>-- @'mapKeysWith' c f s@ is the map obtained by applying @f@ to each key of @s@.</span> <a name="line-1361"></a><span class='hs-comment'>-- </span> <a name="line-1362"></a><span class='hs-comment'>-- The size of the result may be smaller if @f@ maps two or more distinct</span> <a name="line-1363"></a><span class='hs-comment'>-- keys to the same new key. In this case the associated values will be</span> <a name="line-1364"></a><span class='hs-comment'>-- combined using @c@.</span> <a name="line-1365"></a><span class='hs-comment'>--</span> <a name="line-1366"></a><span class='hs-comment'>-- > mapKeysWith (++) (\ _ -> 1) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 1 "cdab"</span> <a name="line-1367"></a><span class='hs-comment'>-- > mapKeysWith (++) (\ _ -> 3) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 3 "cdab"</span> <a name="line-1368"></a> <a name="line-1369"></a><a name="mapKeysWith"></a><span class='hs-definition'>mapKeysWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k2</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k1</span><span class='hs-keyglyph'>-></span><span class='hs-varid'>k2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>a</span> <a name="line-1370"></a><span class='hs-definition'>mapKeysWith</span> <span class='hs-varid'>c</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromListWith</span> <span class='hs-varid'>c</span> <span class='hs-varop'>.</span> <span class='hs-conid'>List</span><span class='hs-varop'>.</span><span class='hs-varid'>map</span> <span class='hs-varid'>fFirst</span> <span class='hs-varop'>.</span> <span class='hs-varid'>toList</span> <a name="line-1371"></a> <span class='hs-keyword'>where</span> <span class='hs-varid'>fFirst</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <a name="line-1372"></a> <a name="line-1373"></a> <a name="line-1374"></a><span class='hs-comment'>-- | /O(n)/.</span> <a name="line-1375"></a><span class='hs-comment'>-- @'mapKeysMonotonic' f s == 'mapKeys' f s@, but works only when @f@</span> <a name="line-1376"></a><span class='hs-comment'>-- is strictly monotonic.</span> <a name="line-1377"></a><span class='hs-comment'>-- That is, for any values @x@ and @y@, if @x@ < @y@ then @f x@ < @f y@.</span> <a name="line-1378"></a><span class='hs-comment'>-- /The precondition is not checked./</span> <a name="line-1379"></a><span class='hs-comment'>-- Semi-formally, we have:</span> <a name="line-1380"></a><span class='hs-comment'>-- </span> <a name="line-1381"></a><span class='hs-comment'>-- > and [x < y ==> f x < f y | x <- ls, y <- ls] </span> <a name="line-1382"></a><span class='hs-comment'>-- > ==> mapKeysMonotonic f s == mapKeys f s</span> <a name="line-1383"></a><span class='hs-comment'>-- > where ls = keys s</span> <a name="line-1384"></a><span class='hs-comment'>--</span> <a name="line-1385"></a><span class='hs-comment'>-- This means that @f@ maps distinct original keys to distinct resulting keys.</span> <a name="line-1386"></a><span class='hs-comment'>-- This function has better performance than 'mapKeys'.</span> <a name="line-1387"></a><span class='hs-comment'>--</span> <a name="line-1388"></a><span class='hs-comment'>-- > mapKeysMonotonic (\ k -> k * 2) (fromList [(5,"a"), (3,"b")]) == fromList [(6, "b"), (10, "a")]</span> <a name="line-1389"></a><span class='hs-comment'>-- > valid (mapKeysMonotonic (\ k -> k * 2) (fromList [(5,"a"), (3,"b")])) == True</span> <a name="line-1390"></a><span class='hs-comment'>-- > valid (mapKeysMonotonic (\ _ -> 1) (fromList [(5,"a"), (3,"b")])) == False</span> <a name="line-1391"></a> <a name="line-1392"></a><a name="mapKeysMonotonic"></a><span class='hs-definition'>mapKeysMonotonic</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k1</span><span class='hs-keyglyph'>-></span><span class='hs-varid'>k2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>a</span> <a name="line-1393"></a><span class='hs-definition'>mapKeysMonotonic</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1394"></a><span class='hs-definition'>mapKeysMonotonic</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sz</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <a name="line-1395"></a> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sz</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapKeysMonotonic</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapKeysMonotonic</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1396"></a> <a name="line-1397"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1398"></a> Folds <a name="line-1399"></a>--------------------------------------------------------------------}</span> <a name="line-1400"></a> <a name="line-1401"></a><a name="fold"></a><span class='hs-comment'>-- | /O(n)/. Fold the values in the map, such that</span> <a name="line-1402"></a><span class='hs-comment'>-- @'fold' f z == 'Prelude.foldr' f z . 'elems'@.</span> <a name="line-1403"></a><span class='hs-comment'>-- For example,</span> <a name="line-1404"></a><span class='hs-comment'>--</span> <a name="line-1405"></a><span class='hs-comment'>-- > elems map = fold (:) [] map</span> <a name="line-1406"></a><span class='hs-comment'>--</span> <a name="line-1407"></a><span class='hs-comment'>-- > let f a len = len + (length a)</span> <a name="line-1408"></a><span class='hs-comment'>-- > fold f 0 (fromList [(5,"a"), (3,"bbb")]) == 4</span> <a name="line-1409"></a><span class='hs-definition'>fold</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <a name="line-1410"></a><span class='hs-definition'>fold</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>z'</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x'</span> <span class='hs-varid'>z'</span><span class='hs-layout'>)</span> <a name="line-1411"></a> <a name="line-1412"></a><a name="foldWithKey"></a><span class='hs-comment'>-- | /O(n)/. Fold the keys and values in the map, such that</span> <a name="line-1413"></a><span class='hs-comment'>-- @'foldWithKey' f z == 'Prelude.foldr' ('uncurry' f) z . 'toAscList'@.</span> <a name="line-1414"></a><span class='hs-comment'>-- For example,</span> <a name="line-1415"></a><span class='hs-comment'>--</span> <a name="line-1416"></a><span class='hs-comment'>-- > keys map = foldWithKey (\k x ks -> k:ks) [] map</span> <a name="line-1417"></a><span class='hs-comment'>--</span> <a name="line-1418"></a><span class='hs-comment'>-- > let f k a result = result ++ "(" ++ (show k) ++ ":" ++ a ++ ")"</span> <a name="line-1419"></a><span class='hs-comment'>-- > foldWithKey f "Map: " (fromList [(5,"a"), (3,"b")]) == "Map: (5:a)(3:b)"</span> <a name="line-1420"></a><span class='hs-comment'>--</span> <a name="line-1421"></a><span class='hs-comment'>-- This is identical to 'foldrWithKey', and you should use that one instead of</span> <a name="line-1422"></a><span class='hs-comment'>-- this one. This name is kept for backward compatibility.</span> <a name="line-1423"></a><span class='hs-definition'>foldWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <a name="line-1424"></a><span class='hs-definition'>foldWithKey</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldrWithKey</span> <a name="line-1425"></a><span class='hs-comment'>{-# DEPRECATED foldWithKey "Use foldrWithKey instead" #-}</span> <a name="line-1426"></a> <a name="line-1427"></a><a name="foldrWithKey"></a><span class='hs-comment'>-- | /O(n)/. Post-order fold. The function will be applied from the lowest</span> <a name="line-1428"></a><span class='hs-comment'>-- value to the highest.</span> <a name="line-1429"></a><span class='hs-definition'>foldrWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <a name="line-1430"></a><span class='hs-definition'>foldrWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1431"></a> <span class='hs-keyword'>where</span> <a name="line-1432"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <a name="line-1433"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <a name="line-1434"></a> <a name="line-1435"></a><a name="foldlWithKey"></a><span class='hs-comment'>-- | /O(n)/. Pre-order fold. The function will be applied from the highest</span> <a name="line-1436"></a><span class='hs-comment'>-- value to the lowest.</span> <a name="line-1437"></a><span class='hs-definition'>foldlWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <a name="line-1438"></a><span class='hs-definition'>foldlWithKey</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1439"></a> <span class='hs-keyword'>where</span> <a name="line-1440"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <a name="line-1441"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-1442"></a> <a name="line-1443"></a><span class='hs-comment'>{- <a name="line-1444"></a>-- | /O(n)/. A strict version of 'foldlWithKey'. <a name="line-1445"></a>foldlWithKey' :: (b -> k -> a -> b) -> b -> Map k a -> b <a name="line-1446"></a>foldlWithKey' f = go <a name="line-1447"></a> where <a name="line-1448"></a> go z Tip = z <a name="line-1449"></a> go z (Bin _ kx x l r) = z `seq` go (f (go z l) kx x) r <a name="line-1450"></a>-}</span> <a name="line-1451"></a> <a name="line-1452"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1453"></a> List variations <a name="line-1454"></a>--------------------------------------------------------------------}</span> <a name="line-1455"></a><span class='hs-comment'>-- | /O(n)/.</span> <a name="line-1456"></a><span class='hs-comment'>-- Return all elements of the map in the ascending order of their keys.</span> <a name="line-1457"></a><span class='hs-comment'>--</span> <a name="line-1458"></a><span class='hs-comment'>-- > elems (fromList [(5,"a"), (3,"b")]) == ["b","a"]</span> <a name="line-1459"></a><span class='hs-comment'>-- > elems empty == []</span> <a name="line-1460"></a> <a name="line-1461"></a><a name="elems"></a><span class='hs-definition'>elems</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <a name="line-1462"></a><span class='hs-definition'>elems</span> <span class='hs-varid'>m</span> <a name="line-1463"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>assocs</span> <span class='hs-varid'>m</span><span class='hs-keyglyph'>]</span> <a name="line-1464"></a> <a name="line-1465"></a><span class='hs-comment'>-- | /O(n)/. Return all keys of the map in ascending order.</span> <a name="line-1466"></a><span class='hs-comment'>--</span> <a name="line-1467"></a><span class='hs-comment'>-- > keys (fromList [(5,"a"), (3,"b")]) == [3,5]</span> <a name="line-1468"></a><span class='hs-comment'>-- > keys empty == []</span> <a name="line-1469"></a> <a name="line-1470"></a><a name="keys"></a><span class='hs-definition'>keys</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>k</span><span class='hs-keyglyph'>]</span> <a name="line-1471"></a><span class='hs-definition'>keys</span> <span class='hs-varid'>m</span> <a name="line-1472"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>assocs</span> <span class='hs-varid'>m</span><span class='hs-keyglyph'>]</span> <a name="line-1473"></a> <a name="line-1474"></a><span class='hs-comment'>-- | /O(n)/. The set of all keys of the map.</span> <a name="line-1475"></a><span class='hs-comment'>--</span> <a name="line-1476"></a><span class='hs-comment'>-- > keysSet (fromList [(5,"a"), (3,"b")]) == Data.Set.fromList [3,5]</span> <a name="line-1477"></a><span class='hs-comment'>-- > keysSet empty == Data.Set.empty</span> <a name="line-1478"></a> <a name="line-1479"></a><a name="keysSet"></a><span class='hs-definition'>keysSet</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Set</span><span class='hs-varop'>.</span><span class='hs-conid'>Set</span> <span class='hs-varid'>k</span> <a name="line-1480"></a><span class='hs-definition'>keysSet</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Set</span><span class='hs-varop'>.</span><span class='hs-varid'>fromDistinctAscList</span> <span class='hs-layout'>(</span><span class='hs-varid'>keys</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <a name="line-1481"></a> <a name="line-1482"></a><span class='hs-comment'>-- | /O(n)/. Return all key\/value pairs in the map in ascending key order.</span> <a name="line-1483"></a><span class='hs-comment'>--</span> <a name="line-1484"></a><span class='hs-comment'>-- > assocs (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")]</span> <a name="line-1485"></a><span class='hs-comment'>-- > assocs empty == []</span> <a name="line-1486"></a> <a name="line-1487"></a><a name="assocs"></a><span class='hs-definition'>assocs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-1488"></a><span class='hs-definition'>assocs</span> <span class='hs-varid'>m</span> <a name="line-1489"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toList</span> <span class='hs-varid'>m</span> <a name="line-1490"></a> <a name="line-1491"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1492"></a> Lists <a name="line-1493"></a> use [foldlStrict] to reduce demand on the control-stack <a name="line-1494"></a>--------------------------------------------------------------------}</span> <a name="line-1495"></a><span class='hs-comment'>-- | /O(n*log n)/. Build a map from a list of key\/value pairs. See also 'fromAscList'.</span> <a name="line-1496"></a><span class='hs-comment'>-- If the list contains more than one value for the same key, the last value</span> <a name="line-1497"></a><span class='hs-comment'>-- for the key is retained.</span> <a name="line-1498"></a><span class='hs-comment'>--</span> <a name="line-1499"></a><span class='hs-comment'>-- > fromList [] == empty</span> <a name="line-1500"></a><span class='hs-comment'>-- > fromList [(5,"a"), (3,"b"), (5, "c")] == fromList [(5,"c"), (3,"b")]</span> <a name="line-1501"></a><span class='hs-comment'>-- > fromList [(5,"c"), (3,"b"), (5, "a")] == fromList [(5,"a"), (3,"b")]</span> <a name="line-1502"></a> <a name="line-1503"></a><a name="fromList"></a><span class='hs-definition'>fromList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1504"></a><span class='hs-definition'>fromList</span> <span class='hs-varid'>xs</span> <a name="line-1505"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldlStrict</span> <span class='hs-varid'>ins</span> <span class='hs-varid'>empty</span> <span class='hs-varid'>xs</span> <a name="line-1506"></a> <span class='hs-keyword'>where</span> <a name="line-1507"></a> <span class='hs-varid'>ins</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insert</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>t</span> <a name="line-1508"></a> <a name="line-1509"></a><span class='hs-comment'>-- | /O(n*log n)/. Build a map from a list of key\/value pairs with a combining function. See also 'fromAscListWith'.</span> <a name="line-1510"></a><span class='hs-comment'>--</span> <a name="line-1511"></a><span class='hs-comment'>-- > fromListWith (++) [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "ab"), (5, "aba")]</span> <a name="line-1512"></a><span class='hs-comment'>-- > fromListWith (++) [] == empty</span> <a name="line-1513"></a> <a name="line-1514"></a><a name="fromListWith"></a><span class='hs-definition'>fromListWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1515"></a><span class='hs-definition'>fromListWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span> <a name="line-1516"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromListWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <a name="line-1517"></a> <a name="line-1518"></a><span class='hs-comment'>-- | /O(n*log n)/. Build a map from a list of key\/value pairs with a combining function. See also 'fromAscListWithKey'.</span> <a name="line-1519"></a><span class='hs-comment'>--</span> <a name="line-1520"></a><span class='hs-comment'>-- > let f k a1 a2 = (show k) ++ a1 ++ a2</span> <a name="line-1521"></a><span class='hs-comment'>-- > fromListWithKey f [(5,"a"), (5,"b"), (3,"b"), (3,"a"), (5,"a")] == fromList [(3, "3ab"), (5, "5a5ba")]</span> <a name="line-1522"></a><span class='hs-comment'>-- > fromListWithKey f [] == empty</span> <a name="line-1523"></a> <a name="line-1524"></a><a name="fromListWithKey"></a><span class='hs-definition'>fromListWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1525"></a><span class='hs-definition'>fromListWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span> <a name="line-1526"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldlStrict</span> <span class='hs-varid'>ins</span> <span class='hs-varid'>empty</span> <span class='hs-varid'>xs</span> <a name="line-1527"></a> <span class='hs-keyword'>where</span> <a name="line-1528"></a> <span class='hs-varid'>ins</span> <span class='hs-varid'>t</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>t</span> <a name="line-1529"></a> <a name="line-1530"></a><span class='hs-comment'>-- | /O(n)/. Convert to a list of key\/value pairs.</span> <a name="line-1531"></a><span class='hs-comment'>--</span> <a name="line-1532"></a><span class='hs-comment'>-- > toList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")]</span> <a name="line-1533"></a><span class='hs-comment'>-- > toList empty == []</span> <a name="line-1534"></a> <a name="line-1535"></a><a name="toList"></a><span class='hs-definition'>toList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-1536"></a><span class='hs-definition'>toList</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toAscList</span> <span class='hs-varid'>t</span> <a name="line-1537"></a> <a name="line-1538"></a><span class='hs-comment'>-- | /O(n)/. Convert to an ascending list.</span> <a name="line-1539"></a><span class='hs-comment'>--</span> <a name="line-1540"></a><span class='hs-comment'>-- > toAscList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")]</span> <a name="line-1541"></a> <a name="line-1542"></a><a name="toAscList"></a><span class='hs-definition'>toAscList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-1543"></a><span class='hs-definition'>toAscList</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldrWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>t</span> <a name="line-1544"></a> <a name="line-1545"></a><a name="toDescList"></a><span class='hs-comment'>-- | /O(n)/. Convert to a descending list.</span> <a name="line-1546"></a><span class='hs-definition'>toDescList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <a name="line-1547"></a><span class='hs-definition'>toDescList</span> <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldlWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>xs</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>t</span> <a name="line-1548"></a> <a name="line-1549"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1550"></a> Building trees from ascending/descending lists can be done in linear time. <a name="line-1551"></a> <a name="line-1552"></a> Note that if [xs] is ascending that: <a name="line-1553"></a> fromAscList xs == fromList xs <a name="line-1554"></a> fromAscListWith f xs == fromListWith f xs <a name="line-1555"></a>--------------------------------------------------------------------}</span> <a name="line-1556"></a><span class='hs-comment'>-- | /O(n)/. Build a map from an ascending list in linear time.</span> <a name="line-1557"></a><span class='hs-comment'>-- /The precondition (input list is ascending) is not checked./</span> <a name="line-1558"></a><span class='hs-comment'>--</span> <a name="line-1559"></a><span class='hs-comment'>-- > fromAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")]</span> <a name="line-1560"></a><span class='hs-comment'>-- > fromAscList [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "b")]</span> <a name="line-1561"></a><span class='hs-comment'>-- > valid (fromAscList [(3,"b"), (5,"a"), (5,"b")]) == True</span> <a name="line-1562"></a><span class='hs-comment'>-- > valid (fromAscList [(5,"a"), (3,"b"), (5,"b")]) == False</span> <a name="line-1563"></a> <a name="line-1564"></a><a name="fromAscList"></a><span class='hs-definition'>fromAscList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1565"></a><span class='hs-definition'>fromAscList</span> <span class='hs-varid'>xs</span> <a name="line-1566"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromAscListWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <a name="line-1567"></a> <a name="line-1568"></a><span class='hs-comment'>-- | /O(n)/. Build a map from an ascending list in linear time with a combining function for equal keys.</span> <a name="line-1569"></a><span class='hs-comment'>-- /The precondition (input list is ascending) is not checked./</span> <a name="line-1570"></a><span class='hs-comment'>--</span> <a name="line-1571"></a><span class='hs-comment'>-- > fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")]</span> <a name="line-1572"></a><span class='hs-comment'>-- > valid (fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")]) == True</span> <a name="line-1573"></a><span class='hs-comment'>-- > valid (fromAscListWith (++) [(5,"a"), (3,"b"), (5,"b")]) == False</span> <a name="line-1574"></a> <a name="line-1575"></a><a name="fromAscListWith"></a><span class='hs-definition'>fromAscListWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1576"></a><span class='hs-definition'>fromAscListWith</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span> <a name="line-1577"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromAscListWithKey</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <a name="line-1578"></a> <a name="line-1579"></a><span class='hs-comment'>-- | /O(n)/. Build a map from an ascending list in linear time with a</span> <a name="line-1580"></a><span class='hs-comment'>-- combining function for equal keys.</span> <a name="line-1581"></a><span class='hs-comment'>-- /The precondition (input list is ascending) is not checked./</span> <a name="line-1582"></a><span class='hs-comment'>--</span> <a name="line-1583"></a><span class='hs-comment'>-- > let f k a1 a2 = (show k) ++ ":" ++ a1 ++ a2</span> <a name="line-1584"></a><span class='hs-comment'>-- > fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b"), (5,"b")] == fromList [(3, "b"), (5, "5:b5:ba")]</span> <a name="line-1585"></a><span class='hs-comment'>-- > valid (fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b"), (5,"b")]) == True</span> <a name="line-1586"></a><span class='hs-comment'>-- > valid (fromAscListWithKey f [(5,"a"), (3,"b"), (5,"b"), (5,"b")]) == False</span> <a name="line-1587"></a> <a name="line-1588"></a><a name="fromAscListWithKey"></a><span class='hs-definition'>fromAscListWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1589"></a><span class='hs-definition'>fromAscListWithKey</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span> <a name="line-1590"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromDistinctAscList</span> <span class='hs-layout'>(</span><span class='hs-varid'>combineEq</span> <span class='hs-varid'>f</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <a name="line-1591"></a> <span class='hs-keyword'>where</span> <a name="line-1592"></a> <span class='hs-comment'>-- [combineEq f xs] combines equal elements with function [f] in an ordered list [xs]</span> <a name="line-1593"></a> <span class='hs-varid'>combineEq</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>xs'</span> <a name="line-1594"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>xs'</span> <span class='hs-keyword'>of</span> <a name="line-1595"></a> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>[]</span> <a name="line-1596"></a> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>]</span> <a name="line-1597"></a> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xx</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>combineEq'</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xx</span> <a name="line-1598"></a> <a name="line-1599"></a> <span class='hs-varid'>combineEq'</span> <span class='hs-varid'>z</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>z</span><span class='hs-keyglyph'>]</span> <a name="line-1600"></a> <span class='hs-varid'>combineEq'</span> <span class='hs-varid'>z</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>kz</span><span class='hs-layout'>,</span><span class='hs-varid'>zz</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span><span class='hs-varid'>xx</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>xs'</span><span class='hs-layout'>)</span> <a name="line-1601"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>kx</span><span class='hs-varop'>==</span><span class='hs-varid'>kz</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>yy</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>xx</span> <span class='hs-varid'>zz</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>combineEq'</span> <span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span><span class='hs-varid'>yy</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs'</span> <a name="line-1602"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span><span class='hs-conop'>:</span><span class='hs-varid'>combineEq'</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs'</span> <a name="line-1603"></a> <a name="line-1604"></a> <a name="line-1605"></a><span class='hs-comment'>-- | /O(n)/. Build a map from an ascending list of distinct elements in linear time.</span> <a name="line-1606"></a><span class='hs-comment'>-- /The precondition is not checked./</span> <a name="line-1607"></a><span class='hs-comment'>--</span> <a name="line-1608"></a><span class='hs-comment'>-- > fromDistinctAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")]</span> <a name="line-1609"></a><span class='hs-comment'>-- > valid (fromDistinctAscList [(3,"b"), (5,"a")]) == True</span> <a name="line-1610"></a><span class='hs-comment'>-- > valid (fromDistinctAscList [(3,"b"), (5,"a"), (5,"b")]) == False</span> <a name="line-1611"></a> <a name="line-1612"></a><a name="fromDistinctAscList"></a><span class='hs-definition'>fromDistinctAscList</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1613"></a><span class='hs-definition'>fromDistinctAscList</span> <span class='hs-varid'>xs</span> <a name="line-1614"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>build</span> <span class='hs-varid'>const</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <a name="line-1615"></a> <span class='hs-keyword'>where</span> <a name="line-1616"></a> <span class='hs-comment'>-- 1) use continutations so that we use heap space instead of stack space.</span> <a name="line-1617"></a> <span class='hs-comment'>-- 2) special case for n==5 to build bushier trees. </span> <a name="line-1618"></a> <span class='hs-varid'>build</span> <span class='hs-varid'>c</span> <span class='hs-num'>0</span> <span class='hs-varid'>xs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>xs'</span> <a name="line-1619"></a> <span class='hs-varid'>build</span> <span class='hs-varid'>c</span> <span class='hs-num'>5</span> <span class='hs-varid'>xs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>xs'</span> <span class='hs-keyword'>of</span> <a name="line-1620"></a> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k1</span><span class='hs-layout'>,</span><span class='hs-varid'>x1</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-varid'>k2</span><span class='hs-layout'>,</span><span class='hs-varid'>x2</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-varid'>k3</span><span class='hs-layout'>,</span><span class='hs-varid'>x3</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-varid'>k4</span><span class='hs-layout'>,</span><span class='hs-varid'>x4</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-varid'>k5</span><span class='hs-layout'>,</span><span class='hs-varid'>x5</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>xx</span><span class='hs-layout'>)</span> <a name="line-1621"></a> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k4</span> <span class='hs-varid'>x4</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-layout'>(</span><span class='hs-varid'>singleton</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>singleton</span> <span class='hs-varid'>k3</span> <span class='hs-varid'>x3</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>singleton</span> <span class='hs-varid'>k5</span> <span class='hs-varid'>x5</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>xx</span> <a name="line-1622"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>error</span> <span class='hs-str'>"fromDistinctAscList build"</span> <a name="line-1623"></a> <span class='hs-varid'>build</span> <span class='hs-varid'>c</span> <span class='hs-varid'>n</span> <span class='hs-varid'>xs'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>seq</span> <span class='hs-varid'>nr</span> <span class='hs-varop'>$</span> <span class='hs-varid'>build</span> <span class='hs-layout'>(</span><span class='hs-varid'>buildR</span> <span class='hs-varid'>nr</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>nl</span> <span class='hs-varid'>xs'</span> <a name="line-1624"></a> <span class='hs-keyword'>where</span> <a name="line-1625"></a> <span class='hs-varid'>nl</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span> <a name="line-1626"></a> <span class='hs-varid'>nr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-comment'>-</span> <span class='hs-varid'>nl</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span> <a name="line-1627"></a> <a name="line-1628"></a> <span class='hs-varid'>buildR</span> <span class='hs-varid'>n</span> <span class='hs-varid'>c</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>build</span> <span class='hs-layout'>(</span><span class='hs-varid'>buildB</span> <span class='hs-varid'>l</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ys</span> <a name="line-1629"></a> <span class='hs-varid'>buildR</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"fromDistinctAscList buildR []"</span> <a name="line-1630"></a> <span class='hs-varid'>buildB</span> <span class='hs-varid'>l</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>c</span> <span class='hs-varid'>r</span> <span class='hs-varid'>zs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-varid'>zs</span> <a name="line-1631"></a> <a name="line-1632"></a> <a name="line-1633"></a> <a name="line-1634"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1635"></a> Utility functions that return sub-ranges of the original <a name="line-1636"></a> tree. Some functions take a comparison function as argument to <a name="line-1637"></a> allow comparisons against infinite values. A function [cmplo k] <a name="line-1638"></a> should be read as [compare lo k]. <a name="line-1639"></a> <a name="line-1640"></a> [trim cmplo cmphi t] A tree that is either empty or where [cmplo k == LT] <a name="line-1641"></a> and [cmphi k == GT] for the key [k] of the root. <a name="line-1642"></a> [filterGt cmp t] A tree where for all keys [k]. [cmp k == LT] <a name="line-1643"></a> [filterLt cmp t] A tree where for all keys [k]. [cmp k == GT] <a name="line-1644"></a> <a name="line-1645"></a> [split k t] Returns two trees [l] and [r] where all keys <a name="line-1646"></a> in [l] are <[k] and all keys in [r] are >[k]. <a name="line-1647"></a> [splitLookup k t] Just like [split] but also returns whether [k] <a name="line-1648"></a> was found in the tree. <a name="line-1649"></a>--------------------------------------------------------------------}</span> <a name="line-1650"></a> <a name="line-1651"></a><a name="trim"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1652"></a> [trim lo hi t] trims away all subtrees that surely contain no <a name="line-1653"></a> values between the range [lo] to [hi]. The returned tree is either <a name="line-1654"></a> empty or the key of the root is between @lo@ and @hi@. <a name="line-1655"></a>--------------------------------------------------------------------}</span> <a name="line-1656"></a><span class='hs-definition'>trim</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1657"></a><span class='hs-definition'>trim</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1658"></a><span class='hs-definition'>trim</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1659"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1660"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1661"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>t</span> <a name="line-1662"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>trim</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>l</span> <a name="line-1663"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>trim</span> <span class='hs-varid'>cmplo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span> <a name="line-1664"></a> <a name="line-1665"></a><a name="trimLookupLo"></a><span class='hs-definition'>trimLookupLo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1666"></a><span class='hs-definition'>trimLookupLo</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span><span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1667"></a><span class='hs-definition'>trimLookupLo</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1668"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1669"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1670"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>lookupAssoc</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>t</span><span class='hs-layout'>,</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <a name="line-1671"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>trimLookupLo</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>l</span> <a name="line-1672"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>trimLookupLo</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span> <a name="line-1673"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>trim</span> <span class='hs-layout'>(</span><span class='hs-varid'>compare</span> <span class='hs-varid'>lo</span><span class='hs-layout'>)</span> <span class='hs-varid'>cmphi</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1674"></a> <a name="line-1675"></a> <a name="line-1676"></a><a name="filterGt"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1677"></a> [filterGt k t] filter all keys >[k] from tree [t] <a name="line-1678"></a> [filterLt k t] filter all keys <[k] from tree [t] <a name="line-1679"></a>--------------------------------------------------------------------}</span> <a name="line-1680"></a><span class='hs-definition'>filterGt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1681"></a><span class='hs-definition'>filterGt</span> <span class='hs-varid'>cmp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1682"></a> <span class='hs-keyword'>where</span> <a name="line-1683"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1684"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>cmp</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1685"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-1686"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <a name="line-1687"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>r</span> <a name="line-1688"></a> <a name="line-1689"></a><a name="filterLt"></a><span class='hs-definition'>filterLt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1690"></a><span class='hs-definition'>filterLt</span> <span class='hs-varid'>cmp</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1691"></a> <span class='hs-keyword'>where</span> <a name="line-1692"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Tip</span> <a name="line-1693"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>cmp</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1694"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <a name="line-1695"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>go</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1696"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>l</span> <a name="line-1697"></a> <a name="line-1698"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1699"></a> Split <a name="line-1700"></a>--------------------------------------------------------------------}</span> <a name="line-1701"></a><span class='hs-comment'>-- | /O(log n)/. The expression (@'split' k map@) is a pair @(map1,map2)@ where</span> <a name="line-1702"></a><span class='hs-comment'>-- the keys in @map1@ are smaller than @k@ and the keys in @map2@ larger than @k@.</span> <a name="line-1703"></a><span class='hs-comment'>-- Any key equal to @k@ is found in neither @map1@ nor @map2@.</span> <a name="line-1704"></a><span class='hs-comment'>--</span> <a name="line-1705"></a><span class='hs-comment'>-- > split 2 (fromList [(5,"a"), (3,"b")]) == (empty, fromList [(3,"b"), (5,"a")])</span> <a name="line-1706"></a><span class='hs-comment'>-- > split 3 (fromList [(5,"a"), (3,"b")]) == (empty, singleton 5 "a")</span> <a name="line-1707"></a><span class='hs-comment'>-- > split 4 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", singleton 5 "a")</span> <a name="line-1708"></a><span class='hs-comment'>-- > split 5 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", empty)</span> <a name="line-1709"></a><span class='hs-comment'>-- > split 6 (fromList [(5,"a"), (3,"b")]) == (fromList [(3,"b"), (5,"a")], empty)</span> <a name="line-1710"></a> <a name="line-1711"></a><a name="split"></a><span class='hs-definition'>split</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1712"></a><span class='hs-definition'>split</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1713"></a> <span class='hs-keyword'>where</span> <a name="line-1714"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span><span class='hs-layout'>,</span> <span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1715"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1716"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>gt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1717"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <a name="line-1718"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1719"></a> <a name="line-1720"></a><span class='hs-comment'>-- | /O(log n)/. The expression (@'splitLookup' k map@) splits a map just</span> <a name="line-1721"></a><span class='hs-comment'>-- like 'split' but also returns @'lookup' k map@.</span> <a name="line-1722"></a><span class='hs-comment'>--</span> <a name="line-1723"></a><span class='hs-comment'>-- > splitLookup 2 (fromList [(5,"a"), (3,"b")]) == (empty, Nothing, fromList [(3,"b"), (5,"a")])</span> <a name="line-1724"></a><span class='hs-comment'>-- > splitLookup 3 (fromList [(5,"a"), (3,"b")]) == (empty, Just "b", singleton 5 "a")</span> <a name="line-1725"></a><span class='hs-comment'>-- > splitLookup 4 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", Nothing, singleton 5 "a")</span> <a name="line-1726"></a><span class='hs-comment'>-- > splitLookup 5 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", Just "a", empty)</span> <a name="line-1727"></a><span class='hs-comment'>-- > splitLookup 6 (fromList [(5,"a"), (3,"b")]) == (fromList [(3,"b"), (5,"a")], Nothing, empty)</span> <a name="line-1728"></a> <a name="line-1729"></a><a name="splitLookup"></a><span class='hs-definition'>splitLookup</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1730"></a><span class='hs-definition'>splitLookup</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1731"></a> <span class='hs-keyword'>where</span> <a name="line-1732"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span><span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1733"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1734"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>gt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1735"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <a name="line-1736"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1737"></a> <a name="line-1738"></a><a name="splitLookupWithKey"></a><span class='hs-comment'>-- | /O(log n)/.</span> <a name="line-1739"></a><span class='hs-definition'>splitLookupWithKey</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1740"></a><span class='hs-definition'>splitLookupWithKey</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-1741"></a> <span class='hs-keyword'>where</span> <a name="line-1742"></a> <span class='hs-varid'>go</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Tip</span><span class='hs-layout'>,</span><span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span><span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1743"></a> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>compare</span> <span class='hs-varid'>k</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>of</span> <a name="line-1744"></a> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>gt</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1745"></a> <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>lt</span><span class='hs-layout'>,</span><span class='hs-varid'>z</span><span class='hs-layout'>,</span><span class='hs-varid'>gt</span><span class='hs-layout'>)</span> <a name="line-1746"></a> <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>kx</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1747"></a> <a name="line-1748"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1749"></a> Utility functions that maintain the balance properties of the tree. <a name="line-1750"></a> All constructors assume that all values in [l] < [k] and all values <a name="line-1751"></a> in [r] > [k], and that [l] and [r] are valid trees. <a name="line-1752"></a> <a name="line-1753"></a> In order of sophistication: <a name="line-1754"></a> [Bin sz k x l r] The type constructor. <a name="line-1755"></a> [bin k x l r] Maintains the correct size, assumes that both [l] <a name="line-1756"></a> and [r] are balanced with respect to each other. <a name="line-1757"></a> [balance k x l r] Restores the balance and size. <a name="line-1758"></a> Assumes that the original tree was balanced and <a name="line-1759"></a> that [l] or [r] has changed by at most one element. <a name="line-1760"></a> [join k x l r] Restores balance and size. <a name="line-1761"></a> <a name="line-1762"></a> Furthermore, we can construct a new tree from two trees. Both operations <a name="line-1763"></a> assume that all values in [l] < all values in [r] and that [l] and [r] <a name="line-1764"></a> are valid: <a name="line-1765"></a> [glue l r] Glues [l] and [r] together. Assumes that [l] and <a name="line-1766"></a> [r] are already balanced with respect to each other. <a name="line-1767"></a> [merge l r] Merges two trees and restores balance. <a name="line-1768"></a> <a name="line-1769"></a> Note: in contrast to Adam's paper, we use (<=) comparisons instead <a name="line-1770"></a> of (<) comparisons in [join], [merge] and [balance]. <a name="line-1771"></a> Quickcheck (on [difference]) showed that this was necessary in order <a name="line-1772"></a> to maintain the invariants. It is quite unsatisfactory that I haven't <a name="line-1773"></a> been able to find out why this is actually the case! Fortunately, it <a name="line-1774"></a> doesn't hurt to be a bit more conservative. <a name="line-1775"></a>--------------------------------------------------------------------}</span> <a name="line-1776"></a> <a name="line-1777"></a><a name="join"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1778"></a> Join <a name="line-1779"></a>--------------------------------------------------------------------}</span> <a name="line-1780"></a><span class='hs-definition'>join</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1781"></a><span class='hs-definition'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertMin</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>r</span> <a name="line-1782"></a><span class='hs-definition'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>insertMax</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <a name="line-1783"></a><span class='hs-definition'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sizeL</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>ly</span> <span class='hs-varid'>ry</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sizeR</span> <span class='hs-varid'>kz</span> <span class='hs-varid'>z</span> <span class='hs-varid'>lz</span> <span class='hs-varid'>rz</span><span class='hs-layout'>)</span> <a name="line-1784"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>sizeL</span> <span class='hs-varop'><=</span> <span class='hs-varid'>sizeR</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kz</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>lz</span><span class='hs-layout'>)</span> <span class='hs-varid'>rz</span> <a name="line-1785"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>sizeR</span> <span class='hs-varop'><=</span> <span class='hs-varid'>sizeL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>ly</span> <span class='hs-layout'>(</span><span class='hs-varid'>join</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>ry</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1786"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bin</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1787"></a> <a name="line-1788"></a> <a name="line-1789"></a><a name="insertMax"></a><span class='hs-comment'>-- insertMin and insertMax don't perform potentially expensive comparisons.</span> <a name="line-1790"></a><span class='hs-definition'>insertMax</span><span class='hs-layout'>,</span><span class='hs-varid'>insertMin</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1791"></a><span class='hs-definition'>insertMax</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>t</span> <a name="line-1792"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-1793"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <a name="line-1794"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1795"></a> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-layout'>(</span><span class='hs-varid'>insertMax</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1796"></a> <a name="line-1797"></a><a name="insertMin"></a><span class='hs-definition'>insertMin</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>t</span> <a name="line-1798"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-1799"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>singleton</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <a name="line-1800"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1801"></a> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>insertMin</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-1802"></a> <a name="line-1803"></a><a name="merge"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1804"></a> [merge l r]: merges two trees. <a name="line-1805"></a>--------------------------------------------------------------------}</span> <a name="line-1806"></a><span class='hs-definition'>merge</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1807"></a><span class='hs-definition'>merge</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <a name="line-1808"></a><span class='hs-definition'>merge</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <a name="line-1809"></a><span class='hs-definition'>merge</span> <span class='hs-varid'>l</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sizeL</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>lx</span> <span class='hs-varid'>rx</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>sizeR</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-varid'>ly</span> <span class='hs-varid'>ry</span><span class='hs-layout'>)</span> <a name="line-1810"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>sizeL</span> <span class='hs-varop'><=</span> <span class='hs-varid'>sizeR</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>ky</span> <span class='hs-varid'>y</span> <span class='hs-layout'>(</span><span class='hs-varid'>merge</span> <span class='hs-varid'>l</span> <span class='hs-varid'>ly</span><span class='hs-layout'>)</span> <span class='hs-varid'>ry</span> <a name="line-1811"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>sizeR</span> <span class='hs-varop'><=</span> <span class='hs-varid'>sizeL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>lx</span> <span class='hs-layout'>(</span><span class='hs-varid'>merge</span> <span class='hs-varid'>rx</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1812"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>glue</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1813"></a> <a name="line-1814"></a><a name="glue"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1815"></a> [glue l r]: glues two trees together. <a name="line-1816"></a> Assumes that [l] and [r] are already balanced with respect to each other. <a name="line-1817"></a>--------------------------------------------------------------------}</span> <a name="line-1818"></a><span class='hs-definition'>glue</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1819"></a><span class='hs-definition'>glue</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span> <a name="line-1820"></a><span class='hs-definition'>glue</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>l</span> <a name="line-1821"></a><span class='hs-definition'>glue</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1822"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <span class='hs-varop'>></span> <span class='hs-varid'>size</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>km</span><span class='hs-layout'>,</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>deleteFindMax</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>km</span> <span class='hs-varid'>m</span> <span class='hs-varid'>l'</span> <span class='hs-varid'>r</span> <a name="line-1823"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>km</span><span class='hs-layout'>,</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>deleteFindMin</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>balance</span> <span class='hs-varid'>km</span> <span class='hs-varid'>m</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r'</span> <a name="line-1824"></a> <a name="line-1825"></a> <a name="line-1826"></a><span class='hs-comment'>-- | /O(log n)/. Delete and find the minimal element.</span> <a name="line-1827"></a><span class='hs-comment'>--</span> <a name="line-1828"></a><span class='hs-comment'>-- > deleteFindMin (fromList [(5,"a"), (3,"b"), (10,"c")]) == ((3,"b"), fromList[(5,"a"), (10,"c")]) </span> <a name="line-1829"></a><span class='hs-comment'>-- > deleteFindMin Error: can not return the minimal element of an empty map</span> <a name="line-1830"></a> <a name="line-1831"></a><a name="deleteFindMin"></a><span class='hs-definition'>deleteFindMin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1832"></a><span class='hs-definition'>deleteFindMin</span> <span class='hs-varid'>t</span> <a name="line-1833"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-1834"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Tip</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1835"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>km</span><span class='hs-layout'>,</span><span class='hs-varid'>l'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>deleteFindMin</span> <span class='hs-varid'>l</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>km</span><span class='hs-layout'>,</span><span class='hs-varid'>balance</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l'</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1836"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>error</span> <span class='hs-str'>"Map.deleteFindMin: can not return the minimal element of an empty map"</span><span class='hs-layout'>,</span> <span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1837"></a> <a name="line-1838"></a><span class='hs-comment'>-- | /O(log n)/. Delete and find the maximal element.</span> <a name="line-1839"></a><span class='hs-comment'>--</span> <a name="line-1840"></a><span class='hs-comment'>-- > deleteFindMax (fromList [(5,"a"), (3,"b"), (10,"c")]) == ((10,"c"), fromList [(3,"b"), (5,"a")])</span> <a name="line-1841"></a><span class='hs-comment'>-- > deleteFindMax empty Error: can not return the maximal element of an empty map</span> <a name="line-1842"></a> <a name="line-1843"></a><a name="deleteFindMax"></a><span class='hs-definition'>deleteFindMax</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-1844"></a><span class='hs-definition'>deleteFindMax</span> <span class='hs-varid'>t</span> <a name="line-1845"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-1846"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>l</span><span class='hs-layout'>)</span> <a name="line-1847"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>km</span><span class='hs-layout'>,</span><span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>deleteFindMax</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>km</span><span class='hs-layout'>,</span><span class='hs-varid'>balance</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r'</span><span class='hs-layout'>)</span> <a name="line-1848"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>error</span> <span class='hs-str'>"Map.deleteFindMax: can not return the maximal element of an empty map"</span><span class='hs-layout'>,</span> <span class='hs-conid'>Tip</span><span class='hs-layout'>)</span> <a name="line-1849"></a> <a name="line-1850"></a> <a name="line-1851"></a><a name="delta"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1852"></a> [balance l x r] balances two trees with value x. <a name="line-1853"></a> The sizes of the trees should balance after decreasing the <a name="line-1854"></a> size of one of them. (a rotation). <a name="line-1855"></a> <a name="line-1856"></a> [delta] is the maximal relative difference between the sizes of <a name="line-1857"></a> two trees, it corresponds with the [w] in Adams' paper. <a name="line-1858"></a> [ratio] is the ratio between an outer and inner sibling of the <a name="line-1859"></a> heavier subtree in an unbalanced setting. It determines <a name="line-1860"></a> whether a double or single rotation should be performed <a name="line-1861"></a> to restore balance. It is correspondes with the inverse <a name="line-1862"></a> of $\alpha$ in Adam's article. <a name="line-1863"></a> <a name="line-1864"></a> Note that: <a name="line-1865"></a> - [delta] should be larger than 4.646 with a [ratio] of 2. <a name="line-1866"></a> - [delta] should be larger than 3.745 with a [ratio] of 1.534. <a name="line-1867"></a> <a name="line-1868"></a> - A lower [delta] leads to a more 'perfectly' balanced tree. <a name="line-1869"></a> - A higher [delta] performs less rebalancing. <a name="line-1870"></a> <a name="line-1871"></a> - Balancing is automatic for random data and a balancing <a name="line-1872"></a> scheme is only necessary to avoid pathological worst cases. <a name="line-1873"></a> Almost any choice will do, and in practice, a rather large <a name="line-1874"></a> [delta] may perform better than smaller one. <a name="line-1875"></a> <a name="line-1876"></a> Note: in contrast to Adam's paper, we use a ratio of (at least) [2] <a name="line-1877"></a> to decide whether a single or double rotation is needed. Allthough <a name="line-1878"></a> he actually proves that this ratio is needed to maintain the <a name="line-1879"></a> invariants, his implementation uses an invalid ratio of [1]. <a name="line-1880"></a>--------------------------------------------------------------------}</span> <a name="line-1881"></a><span class='hs-definition'>delta</span><span class='hs-layout'>,</span><span class='hs-varid'>ratio</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <a name="line-1882"></a><span class='hs-definition'>delta</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>4</span> <a name="line-1883"></a><a name="ratio"></a><span class='hs-definition'>ratio</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span> <a name="line-1884"></a> <a name="line-1885"></a><a name="balance"></a><span class='hs-definition'>balance</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1886"></a><span class='hs-definition'>balance</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1887"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>sizeL</span> <span class='hs-varop'>+</span> <span class='hs-varid'>sizeR</span> <span class='hs-varop'><=</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sizeX</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1888"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>sizeR</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>sizeL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rotateL</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1889"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>sizeL</span> <span class='hs-varop'>>=</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>sizeR</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rotateR</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1890"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sizeX</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1891"></a> <span class='hs-keyword'>where</span> <a name="line-1892"></a> <span class='hs-varid'>sizeL</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <a name="line-1893"></a> <span class='hs-varid'>sizeR</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>size</span> <span class='hs-varid'>r</span> <a name="line-1894"></a> <span class='hs-varid'>sizeX</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sizeL</span> <span class='hs-varop'>+</span> <span class='hs-varid'>sizeR</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span> <a name="line-1895"></a> <a name="line-1896"></a><a name="rotateL"></a><span class='hs-comment'>-- rotate</span> <a name="line-1897"></a><span class='hs-definition'>rotateL</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-1898"></a><span class='hs-definition'>rotateL</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ly</span> <span class='hs-varid'>ry</span><span class='hs-layout'>)</span> <a name="line-1899"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>size</span> <span class='hs-varid'>ly</span> <span class='hs-varop'><</span> <span class='hs-varid'>ratio</span><span class='hs-varop'>*</span><span class='hs-varid'>size</span> <span class='hs-varid'>ry</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singleL</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1900"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doubleL</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1901"></a><span class='hs-definition'>rotateL</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"rotateL Tip"</span> <a name="line-1902"></a> <a name="line-1903"></a><a name="rotateR"></a><span class='hs-definition'>rotateR</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-1904"></a><span class='hs-definition'>rotateR</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ly</span> <span class='hs-varid'>ry</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-1905"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>size</span> <span class='hs-varid'>ry</span> <span class='hs-varop'><</span> <span class='hs-varid'>ratio</span><span class='hs-varop'>*</span><span class='hs-varid'>size</span> <span class='hs-varid'>ly</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>singleR</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1906"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>doubleR</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1907"></a><span class='hs-definition'>rotateR</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"rotateR Tip"</span> <a name="line-1908"></a> <a name="line-1909"></a><a name="singleL"></a><span class='hs-comment'>-- basic rotations</span> <a name="line-1910"></a><span class='hs-definition'>singleL</span><span class='hs-layout'>,</span> <span class='hs-varid'>singleR</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-1911"></a><span class='hs-definition'>singleL</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>t1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>t2</span> <span class='hs-varid'>t3</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bin</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varid'>t3</span> <a name="line-1912"></a><span class='hs-definition'>singleL</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"singleL Tip"</span> <a name="line-1913"></a><a name="singleR"></a><span class='hs-definition'>singleR</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varid'>t3</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bin</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>t1</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>t2</span> <span class='hs-varid'>t3</span><span class='hs-layout'>)</span> <a name="line-1914"></a><span class='hs-definition'>singleR</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"singleR Tip"</span> <a name="line-1915"></a> <a name="line-1916"></a><a name="doubleL"></a><span class='hs-definition'>doubleL</span><span class='hs-layout'>,</span> <span class='hs-varid'>doubleR</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <a name="line-1917"></a><span class='hs-definition'>doubleL</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>t1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k3</span> <span class='hs-varid'>x3</span> <span class='hs-varid'>t2</span> <span class='hs-varid'>t3</span><span class='hs-layout'>)</span> <span class='hs-varid'>t4</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bin</span> <span class='hs-varid'>k3</span> <span class='hs-varid'>x3</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>t3</span> <span class='hs-varid'>t4</span><span class='hs-layout'>)</span> <a name="line-1918"></a><span class='hs-definition'>doubleL</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"doubleL"</span> <a name="line-1919"></a><a name="doubleR"></a><span class='hs-definition'>doubleR</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>t1</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>k3</span> <span class='hs-varid'>x3</span> <span class='hs-varid'>t2</span> <span class='hs-varid'>t3</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>t4</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bin</span> <span class='hs-varid'>k3</span> <span class='hs-varid'>x3</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k2</span> <span class='hs-varid'>x2</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>bin</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>x1</span> <span class='hs-varid'>t3</span> <span class='hs-varid'>t4</span><span class='hs-layout'>)</span> <a name="line-1920"></a><span class='hs-definition'>doubleR</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"doubleR"</span> <a name="line-1921"></a> <a name="line-1922"></a> <a name="line-1923"></a><a name="bin"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1924"></a> The bin constructor maintains the size of the tree <a name="line-1925"></a>--------------------------------------------------------------------}</span> <a name="line-1926"></a><span class='hs-definition'>bin</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <a name="line-1927"></a><span class='hs-definition'>bin</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1928"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bin</span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <span class='hs-varop'>+</span> <span class='hs-varid'>size</span> <span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-1929"></a> <a name="line-1930"></a> <a name="line-1931"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1932"></a> Eq converts the tree to a list. In a lazy setting, this <a name="line-1933"></a> actually seems one of the faster methods to compare two trees <a name="line-1934"></a> and it is certainly the simplest :-) <a name="line-1935"></a>--------------------------------------------------------------------}</span> <a name="line-1936"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-1937"></a> <span class='hs-varid'>t1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>t2</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>size</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&&</span> <span class='hs-layout'>(</span><span class='hs-varid'>toAscList</span> <span class='hs-varid'>t1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>toAscList</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <a name="line-1938"></a> <a name="line-1939"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1940"></a> Ord <a name="line-1941"></a>--------------------------------------------------------------------}</span> <a name="line-1942"></a> <a name="line-1943"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Ord</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-1944"></a> <span class='hs-varid'>compare</span> <span class='hs-varid'>m1</span> <span class='hs-varid'>m2</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-varid'>toAscList</span> <span class='hs-varid'>m1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>toAscList</span> <span class='hs-varid'>m2</span><span class='hs-layout'>)</span> <a name="line-1945"></a> <a name="line-1946"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1947"></a> Functor <a name="line-1948"></a>--------------------------------------------------------------------}</span> <a name="line-1949"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-1950"></a> <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <a name="line-1951"></a> <a name="line-1952"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Traversable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-1953"></a> <span class='hs-varid'>traverse</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pure</span> <span class='hs-conid'>Tip</span> <a name="line-1954"></a> <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>s</span> <span class='hs-varid'>k</span> <span class='hs-varid'>v</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1955"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-varid'>s</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-varop'><$></span> <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l</span> <span class='hs-varop'><*></span> <span class='hs-varid'>f</span> <span class='hs-varid'>v</span> <span class='hs-varop'><*></span> <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <a name="line-1956"></a> <a name="line-1957"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Foldable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-1958"></a> <span class='hs-varid'>foldMap</span> <span class='hs-sel'>_f</span> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mempty</span> <a name="line-1959"></a> <span class='hs-varid'>foldMap</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Bin</span> <span class='hs-sel'>_s</span> <span class='hs-sel'>_k</span> <span class='hs-varid'>v</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <a name="line-1960"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldMap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l</span> <span class='hs-varop'>`mappend`</span> <span class='hs-varid'>f</span> <span class='hs-varid'>v</span> <span class='hs-varop'>`mappend`</span> <span class='hs-varid'>foldMap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>r</span> <a name="line-1961"></a> <a name="line-1962"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1963"></a> Read <a name="line-1964"></a>--------------------------------------------------------------------}</span> <a name="line-1965"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Read</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-1966"></a><span class='hs-cpp'>#ifdef __GLASGOW_HASKELL__</span> <a name="line-1967"></a> <span class='hs-varid'>readPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>parens</span> <span class='hs-varop'>$</span> <span class='hs-varid'>prec</span> <span class='hs-num'>10</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> <a name="line-1968"></a> <span class='hs-conid'>Ident</span> <span class='hs-str'>"fromList"</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>lexP</span> <a name="line-1969"></a> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>readPrec</span> <a name="line-1970"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromList</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <a name="line-1971"></a> <a name="line-1972"></a> <span class='hs-varid'>readListPrec</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readListPrecDefault</span> <a name="line-1973"></a><span class='hs-cpp'>#else</span> <a name="line-1974"></a> <span class='hs-varid'>readsPrec</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readParen</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>></span> <span class='hs-num'>10</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>do</span> <a name="line-1975"></a> <span class='hs-layout'>(</span><span class='hs-str'>"fromList"</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>lex</span> <span class='hs-varid'>r</span> <a name="line-1976"></a> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>reads</span> <span class='hs-varid'>s</span> <a name="line-1977"></a> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromList</span> <span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span> <a name="line-1978"></a><span class='hs-cpp'>#endif</span> <a name="line-1979"></a> <a name="line-1980"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-1981"></a> Show <a name="line-1982"></a>--------------------------------------------------------------------}</span> <a name="line-1983"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Show</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-1984"></a> <span class='hs-varid'>showsPrec</span> <span class='hs-varid'>d</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showParen</span> <span class='hs-layout'>(</span><span class='hs-varid'>d</span> <span class='hs-varop'>></span> <span class='hs-num'>10</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <a name="line-1985"></a> <span class='hs-varid'>showString</span> <span class='hs-str'>"fromList "</span> <span class='hs-varop'>.</span> <span class='hs-varid'>shows</span> <span class='hs-layout'>(</span><span class='hs-varid'>toList</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <a name="line-1986"></a> <a name="line-1987"></a><a name="showTree"></a><span class='hs-comment'>-- | /O(n)/. Show the tree that implements the map. The tree is shown</span> <a name="line-1988"></a><span class='hs-comment'>-- in a compressed, hanging format. See 'showTreeWith'.</span> <a name="line-1989"></a><span class='hs-definition'>showTree</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span><span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-1990"></a><span class='hs-definition'>showTree</span> <span class='hs-varid'>m</span> <a name="line-1991"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showTreeWith</span> <span class='hs-varid'>showElem</span> <span class='hs-conid'>True</span> <span class='hs-conid'>False</span> <span class='hs-varid'>m</span> <a name="line-1992"></a> <span class='hs-keyword'>where</span> <a name="line-1993"></a> <span class='hs-varid'>showElem</span> <span class='hs-varid'>k</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varid'>k</span> <span class='hs-varop'>++</span> <span class='hs-str'>":="</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>x</span> <a name="line-1994"></a> <a name="line-1995"></a> <a name="line-1996"></a><a name="showTreeWith"></a><span class='hs-comment'>{- | /O(n)/. The expression (@'showTreeWith' showelem hang wide map@) shows <a name="line-1997"></a> the tree that implements the map. Elements are shown using the @showElem@ function. If @hang@ is <a name="line-1998"></a> 'True', a /hanging/ tree is shown otherwise a rotated tree is shown. If <a name="line-1999"></a> @wide@ is 'True', an extra wide version is shown. <a name="line-2000"></a> <a name="line-2001"></a>> Map> let t = fromDistinctAscList [(x,()) | x <- [1..5]] <a name="line-2002"></a>> Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True False t <a name="line-2003"></a>> (4,()) <a name="line-2004"></a>> +--(2,()) <a name="line-2005"></a>> | +--(1,()) <a name="line-2006"></a>> | +--(3,()) <a name="line-2007"></a>> +--(5,()) <a name="line-2008"></a>> <a name="line-2009"></a>> Map> putStrLn $ showTreeWith (\k x -> show (k,x)) True True t <a name="line-2010"></a>> (4,()) <a name="line-2011"></a>> | <a name="line-2012"></a>> +--(2,()) <a name="line-2013"></a>> | | <a name="line-2014"></a>> | +--(1,()) <a name="line-2015"></a>> | | <a name="line-2016"></a>> | +--(3,()) <a name="line-2017"></a>> | <a name="line-2018"></a>> +--(5,()) <a name="line-2019"></a>> <a name="line-2020"></a>> Map> putStrLn $ showTreeWith (\k x -> show (k,x)) False True t <a name="line-2021"></a>> +--(5,()) <a name="line-2022"></a>> | <a name="line-2023"></a>> (4,()) <a name="line-2024"></a>> | <a name="line-2025"></a>> | +--(3,()) <a name="line-2026"></a>> | | <a name="line-2027"></a>> +--(2,()) <a name="line-2028"></a>> | <a name="line-2029"></a>> +--(1,()) <a name="line-2030"></a> <a name="line-2031"></a>-}</span> <a name="line-2032"></a><span class='hs-definition'>showTreeWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-2033"></a><span class='hs-definition'>showTreeWith</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>hang</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>t</span> <a name="line-2034"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>hang</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>showsTreeHang</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-str'>""</span> <a name="line-2035"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>showsTree</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-str'>""</span> <a name="line-2036"></a> <a name="line-2037"></a><a name="showsTree"></a><span class='hs-definition'>showsTree</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ShowS</span> <a name="line-2038"></a><span class='hs-definition'>showsTree</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>lbars</span> <span class='hs-varid'>rbars</span> <span class='hs-varid'>t</span> <a name="line-2039"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-2040"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>showsBars</span> <span class='hs-varid'>lbars</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"|\n"</span> <a name="line-2041"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Tip</span> <span class='hs-conid'>Tip</span> <a name="line-2042"></a> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>showsBars</span> <span class='hs-varid'>lbars</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-varid'>showelem</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"\n"</span> <a name="line-2043"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-2044"></a> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>showsTree</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-layout'>(</span><span class='hs-varid'>withBar</span> <span class='hs-varid'>rbars</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>withEmpty</span> <span class='hs-varid'>rbars</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <span class='hs-varop'>.</span> <a name="line-2045"></a> <span class='hs-varid'>showWide</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>rbars</span> <span class='hs-varop'>.</span> <a name="line-2046"></a> <span class='hs-varid'>showsBars</span> <span class='hs-varid'>lbars</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-varid'>showelem</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"\n"</span> <span class='hs-varop'>.</span> <a name="line-2047"></a> <span class='hs-varid'>showWide</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>lbars</span> <span class='hs-varop'>.</span> <a name="line-2048"></a> <span class='hs-varid'>showsTree</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-layout'>(</span><span class='hs-varid'>withEmpty</span> <span class='hs-varid'>lbars</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>withBar</span> <span class='hs-varid'>lbars</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <a name="line-2049"></a> <a name="line-2050"></a><a name="showsTreeHang"></a><span class='hs-definition'>showsTreeHang</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ShowS</span> <a name="line-2051"></a><span class='hs-definition'>showsTreeHang</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>bars</span> <span class='hs-varid'>t</span> <a name="line-2052"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-2053"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>showsBars</span> <span class='hs-varid'>bars</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"|\n"</span> <a name="line-2054"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-conid'>Tip</span> <span class='hs-conid'>Tip</span> <a name="line-2055"></a> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>showsBars</span> <span class='hs-varid'>bars</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-varid'>showelem</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"\n"</span> <a name="line-2056"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <a name="line-2057"></a> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>showsBars</span> <span class='hs-varid'>bars</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-varid'>showelem</span> <span class='hs-varid'>kx</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"\n"</span> <span class='hs-varop'>.</span> <a name="line-2058"></a> <span class='hs-varid'>showWide</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>bars</span> <span class='hs-varop'>.</span> <a name="line-2059"></a> <span class='hs-varid'>showsTreeHang</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-layout'>(</span><span class='hs-varid'>withBar</span> <span class='hs-varid'>bars</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <span class='hs-varop'>.</span> <a name="line-2060"></a> <span class='hs-varid'>showWide</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>bars</span> <span class='hs-varop'>.</span> <a name="line-2061"></a> <span class='hs-varid'>showsTreeHang</span> <span class='hs-varid'>showelem</span> <span class='hs-varid'>wide</span> <span class='hs-layout'>(</span><span class='hs-varid'>withEmpty</span> <span class='hs-varid'>bars</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span> <a name="line-2062"></a> <a name="line-2063"></a><a name="showWide"></a><span class='hs-definition'>showWide</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-2064"></a><span class='hs-definition'>showWide</span> <span class='hs-varid'>wide</span> <span class='hs-varid'>bars</span> <a name="line-2065"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>wide</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>bars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-str'>"|\n"</span> <a name="line-2066"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <a name="line-2067"></a> <a name="line-2068"></a><a name="showsBars"></a><span class='hs-definition'>showsBars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>ShowS</span> <a name="line-2069"></a><span class='hs-definition'>showsBars</span> <span class='hs-varid'>bars</span> <a name="line-2070"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>bars</span> <span class='hs-keyword'>of</span> <a name="line-2071"></a> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>id</span> <a name="line-2072"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>showString</span> <span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-layout'>(</span><span class='hs-varid'>reverse</span> <span class='hs-layout'>(</span><span class='hs-varid'>tail</span> <span class='hs-varid'>bars</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>showString</span> <span class='hs-varid'>node</span> <a name="line-2073"></a> <a name="line-2074"></a><a name="node"></a><span class='hs-definition'>node</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <a name="line-2075"></a><span class='hs-definition'>node</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"+--"</span> <a name="line-2076"></a> <a name="line-2077"></a><a name="withBar"></a><span class='hs-definition'>withBar</span><span class='hs-layout'>,</span> <span class='hs-varid'>withEmpty</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <a name="line-2078"></a><span class='hs-definition'>withBar</span> <span class='hs-varid'>bars</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"| "</span><span class='hs-conop'>:</span><span class='hs-varid'>bars</span> <a name="line-2079"></a><a name="withEmpty"></a><span class='hs-definition'>withEmpty</span> <span class='hs-varid'>bars</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>" "</span><span class='hs-conop'>:</span><span class='hs-varid'>bars</span> <a name="line-2080"></a> <a name="line-2081"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-2082"></a> Typeable <a name="line-2083"></a>--------------------------------------------------------------------}</span> <a name="line-2084"></a> <a name="line-2085"></a><span class='hs-cpp'>#include "Typeable.h"</span> <a name="line-2086"></a><span class='hs-conid'>INSTANCE_TYPEABLE2</span><span class='hs-layout'>(</span><span class='hs-conid'>Map</span><span class='hs-layout'>,</span><span class='hs-varid'>mapTc</span><span class='hs-layout'>,</span><span class='hs-str'>"Map"</span><span class='hs-layout'>)</span> <a name="line-2087"></a> <a name="line-2088"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-2089"></a> Assertions <a name="line-2090"></a>--------------------------------------------------------------------}</span> <a name="line-2091"></a><span class='hs-comment'>-- | /O(n)/. Test if the internal map structure is valid.</span> <a name="line-2092"></a><span class='hs-comment'>--</span> <a name="line-2093"></a><span class='hs-comment'>-- > valid (fromAscList [(3,"b"), (5,"a")]) == True</span> <a name="line-2094"></a><span class='hs-comment'>-- > valid (fromAscList [(5,"a"), (3,"b")]) == False</span> <a name="line-2095"></a> <a name="line-2096"></a><a name="valid"></a><span class='hs-definition'>valid</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-2097"></a><span class='hs-definition'>valid</span> <span class='hs-varid'>t</span> <a name="line-2098"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>balanced</span> <span class='hs-varid'>t</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>ordered</span> <span class='hs-varid'>t</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>validsize</span> <span class='hs-varid'>t</span> <a name="line-2099"></a> <a name="line-2100"></a><a name="ordered"></a><span class='hs-definition'>ordered</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-2101"></a><span class='hs-definition'>ordered</span> <span class='hs-varid'>t</span> <a name="line-2102"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bounded</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-conid'>True</span><span class='hs-layout'>)</span> <span class='hs-varid'>t</span> <a name="line-2103"></a> <span class='hs-keyword'>where</span> <a name="line-2104"></a> <span class='hs-varid'>bounded</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>t'</span> <a name="line-2105"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t'</span> <span class='hs-keyword'>of</span> <a name="line-2106"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-2107"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>kx</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>lo</span> <span class='hs-varid'>kx</span><span class='hs-layout'>)</span> <span class='hs-varop'>&&</span> <span class='hs-layout'>(</span><span class='hs-varid'>hi</span> <span class='hs-varid'>kx</span><span class='hs-layout'>)</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>bounded</span> <span class='hs-varid'>lo</span> <span class='hs-layout'>(</span><span class='hs-varop'><</span><span class='hs-varid'>kx</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>bounded</span> <span class='hs-layout'>(</span><span class='hs-varop'>></span><span class='hs-varid'>kx</span><span class='hs-layout'>)</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>r</span> <a name="line-2108"></a> <a name="line-2109"></a><a name="balanced"></a><span class='hs-comment'>-- | Exported only for "Debug.QuickCheck"</span> <a name="line-2110"></a><span class='hs-definition'>balanced</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-2111"></a><span class='hs-definition'>balanced</span> <span class='hs-varid'>t</span> <a name="line-2112"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>of</span> <a name="line-2113"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>True</span> <a name="line-2114"></a> <span class='hs-conid'>Bin</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <span class='hs-varop'>+</span> <span class='hs-varid'>size</span> <span class='hs-varid'>r</span> <span class='hs-varop'><=</span> <span class='hs-num'>1</span> <span class='hs-varop'>||</span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span> <span class='hs-varid'>l</span> <span class='hs-varop'><=</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>size</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>size</span> <span class='hs-varid'>r</span> <span class='hs-varop'><=</span> <span class='hs-varid'>delta</span><span class='hs-varop'>*</span><span class='hs-varid'>size</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&&</span> <a name="line-2115"></a> <span class='hs-varid'>balanced</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>balanced</span> <span class='hs-varid'>r</span> <a name="line-2116"></a> <a name="line-2117"></a><a name="validsize"></a><span class='hs-definition'>validsize</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-2118"></a><span class='hs-definition'>validsize</span> <span class='hs-varid'>t</span> <a name="line-2119"></a> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>realsize</span> <span class='hs-varid'>t</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-2120"></a> <span class='hs-keyword'>where</span> <a name="line-2121"></a> <span class='hs-varid'>realsize</span> <span class='hs-varid'>t'</span> <a name="line-2122"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>t'</span> <span class='hs-keyword'>of</span> <a name="line-2123"></a> <span class='hs-conid'>Tip</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-num'>0</span> <a name="line-2124"></a> <span class='hs-conid'>Bin</span> <span class='hs-varid'>sz</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>l</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>realsize</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span><span class='hs-varid'>realsize</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span> <a name="line-2125"></a> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span><span class='hs-conid'>Just</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-varid'>m</span><span class='hs-varop'>+</span><span class='hs-num'>1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>sz</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Just</span> <span class='hs-varid'>sz</span> <a name="line-2126"></a> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Nothing</span> <a name="line-2127"></a> <a name="line-2128"></a><a name="foldlStrict"></a><span class='hs-comment'>{-------------------------------------------------------------------- <a name="line-2129"></a> Utilities <a name="line-2130"></a>--------------------------------------------------------------------}</span> <a name="line-2131"></a><span class='hs-definition'>foldlStrict</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>b</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>a</span> <a name="line-2132"></a><span class='hs-definition'>foldlStrict</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <a name="line-2133"></a> <span class='hs-keyword'>where</span> <a name="line-2134"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <a name="line-2135"></a> <span class='hs-varid'>go</span> <span class='hs-varid'>z</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>z</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>z</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <a name="line-2136"></a> <a name="line-2137"></a> </pre></body> </html>