Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 713a839fbe9e3a49c20b773838f30d3c > files > 78

ghc-containers-devel-0.4.0.0-16.fc15.i686.rpm

<?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'>-- &gt;  import Data.Map (Map)</span>
<a name="line-20"></a><span class='hs-comment'>-- &gt;  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'>--     &lt;<a href="http://www.swiss.ai.mit.edu/~adams/BB/">http://www.swiss.ai.mit.edu/~adams/BB/</a>&gt;.</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 &lt;<a href="http://en.wikipedia.org/wiki/Big_O_notation">http://en.wikipedia.org/wiki/Big_O_notation</a>&gt;.</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'>&lt;$&gt;</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'>-- &gt; fromList [(5,'a'), (3,'b')] ! 1    Error: element not in the map</span>
<a name="line-222"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</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'>=&gt;</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'>-- &gt; Data.Map.null (empty)           == True</span>
<a name="line-269"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; size empty                                   == 0</span>
<a name="line-278"></a><span class='hs-comment'>-- &gt; size (singleton 1 'a')                       == 1</span>
<a name="line-279"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; import Prelude hiding (lookup)</span>
<a name="line-294"></a><span class='hs-comment'>-- &gt; import Data.Map</span>
<a name="line-295"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-296"></a><span class='hs-comment'>-- &gt; employeeDept = fromList([("John","Sales"), ("Bob","IT")])</span>
<a name="line-297"></a><span class='hs-comment'>-- &gt; deptCountry = fromList([("IT","USA"), ("Sales","France")])</span>
<a name="line-298"></a><span class='hs-comment'>-- &gt; countryCurrency = fromList([("USA", "Dollar"), ("France", "Euro")])</span>
<a name="line-299"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-300"></a><span class='hs-comment'>-- &gt; employeeCurrency :: String -&gt; Maybe String</span>
<a name="line-301"></a><span class='hs-comment'>-- &gt; employeeCurrency name = do</span>
<a name="line-302"></a><span class='hs-comment'>-- &gt;     dept &lt;- lookup name employeeDept</span>
<a name="line-303"></a><span class='hs-comment'>-- &gt;     country &lt;- lookup dept deptCountry</span>
<a name="line-304"></a><span class='hs-comment'>-- &gt;     lookup country countryCurrency</span>
<a name="line-305"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-306"></a><span class='hs-comment'>-- &gt; main = do</span>
<a name="line-307"></a><span class='hs-comment'>-- &gt;     putStrLn $ "John's currency: " ++ (show (employeeCurrency "John"))</span>
<a name="line-308"></a><span class='hs-comment'>-- &gt;     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'>-- &gt;   John's currency: Just "Euro"</span>
<a name="line-313"></a><span class='hs-comment'>-- &gt;   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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; member 5 (fromList [(5,'a'), (3,'b')]) == True</span>
<a name="line-338"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; notMember 5 (fromList [(5,'a'), (3,'b')]) == False</span>
<a name="line-348"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; findWithDefault 'x' 1 (fromList [(5,'a'), (3,'b')]) == 'x'</span>
<a name="line-366"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; empty      == fromList []</span>
<a name="line-379"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; singleton 1 'a'        == fromList [(1, 'a')]</span>
<a name="line-387"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; insert 5 'x' (fromList [(5,'a'), (3,'b')]) == fromList [(3, 'b'), (5, 'x')]</span>
<a name="line-401"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; insertWith (++) 5 "xxx" (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "xxxa")]</span>
<a name="line-421"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f key new_value old_value = (show key) ++ ":" ++ new_value ++ "|" ++ old_value</span>
<a name="line-445"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; 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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; let f key new_value old_value = (show key) ++ ":" ++ new_value ++ "|" ++ old_value</span>
<a name="line-476"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; 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'>-- &gt; 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'>-- &gt; let insertLookup kx x t = insertLookupWithKey (\_ a _ -&gt; a) kx x t</span>
<a name="line-483"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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 -&gt; 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'>-- &gt; delete 5 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span>
<a name="line-521"></a><span class='hs-comment'>-- &gt; delete 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span>
<a name="line-522"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; adjust ("new " ++) 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "new a")]</span>
<a name="line-539"></a><span class='hs-comment'>-- &gt; adjust ("new " ++) 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span>
<a name="line-540"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f key x = (show key) ++ ":new " ++ x</span>
<a name="line-549"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; adjustWithKey f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span>
<a name="line-551"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f x = if x == "a" then Just "new a" else Nothing</span>
<a name="line-561"></a><span class='hs-comment'>-- &gt; update f 5 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "new a")]</span>
<a name="line-562"></a><span class='hs-comment'>-- &gt; update f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span>
<a name="line-563"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>-- &gt; 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'>-- &gt; updateWithKey f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span>
<a name="line-576"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>-- &gt; 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'>-- &gt; updateLookupWithKey f 7 (fromList [(5,"a"), (3,"b")]) == (Nothing,  fromList [(3, "b"), (5, "a")])</span>
<a name="line-597"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; let f _ = Nothing</span>
<a name="line-616"></a><span class='hs-comment'>-- &gt; alter f 7 (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "a")]</span>
<a name="line-617"></a><span class='hs-comment'>-- &gt; alter f 5 (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span>
<a name="line-618"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-619"></a><span class='hs-comment'>-- &gt; let f _ = Just "c"</span>
<a name="line-620"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; findIndex 2 (fromList [(5,"a"), (3,"b")])    Error: element is not in the map</span>
<a name="line-645"></a><span class='hs-comment'>-- &gt; findIndex 3 (fromList [(5,"a"), (3,"b")]) == 0</span>
<a name="line-646"></a><span class='hs-comment'>-- &gt; findIndex 5 (fromList [(5,"a"), (3,"b")]) == 1</span>
<a name="line-647"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; isJust (lookupIndex 2 (fromList [(5,"a"), (3,"b")]))   == False</span>
<a name="line-659"></a><span class='hs-comment'>-- &gt; fromJust (lookupIndex 3 (fromList [(5,"a"), (3,"b")])) == 0</span>
<a name="line-660"></a><span class='hs-comment'>-- &gt; fromJust (lookupIndex 5 (fromList [(5,"a"), (3,"b")])) == 1</span>
<a name="line-661"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; elemAt 0 (fromList [(5,"a"), (3,"b")]) == (3,"b")</span>
<a name="line-677"></a><span class='hs-comment'>-- &gt; elemAt 1 (fromList [(5,"a"), (3,"b")]) == (5, "a")</span>
<a name="line-678"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; updateAt (\ _ _ -&gt; Just "x") 0    (fromList [(5,"a"), (3,"b")]) == fromList [(3, "x"), (5, "a")]</span>
<a name="line-694"></a><span class='hs-comment'>-- &gt; updateAt (\ _ _ -&gt; Just "x") 1    (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "x")]</span>
<a name="line-695"></a><span class='hs-comment'>-- &gt; updateAt (\ _ _ -&gt; Just "x") 2    (fromList [(5,"a"), (3,"b")])    Error: index out of range</span>
<a name="line-696"></a><span class='hs-comment'>-- &gt; updateAt (\ _ _ -&gt; Just "x") (-1) (fromList [(5,"a"), (3,"b")])    Error: index out of range</span>
<a name="line-697"></a><span class='hs-comment'>-- &gt; updateAt (\_ _  -&gt; Nothing)  0    (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span>
<a name="line-698"></a><span class='hs-comment'>-- &gt; updateAt (\_ _  -&gt; Nothing)  1    (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span>
<a name="line-699"></a><span class='hs-comment'>-- &gt; updateAt (\_ _  -&gt; Nothing)  2    (fromList [(5,"a"), (3,"b")])    Error: index out of range</span>
<a name="line-700"></a><span class='hs-comment'>-- &gt; updateAt (\_ _  -&gt; 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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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 -&gt; 'Nothing') i map@).</span>
<a name="line-717"></a><span class='hs-comment'>--</span>
<a name="line-718"></a><span class='hs-comment'>-- &gt; deleteAt 0  (fromList [(5,"a"), (3,"b")]) == singleton 5 "a"</span>
<a name="line-719"></a><span class='hs-comment'>-- &gt; deleteAt 1  (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span>
<a name="line-720"></a><span class='hs-comment'>-- &gt; deleteAt 2 (fromList [(5,"a"), (3,"b")])     Error: index out of range</span>
<a name="line-721"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; findMin (fromList [(5,"a"), (3,"b")]) == (3,"b")</span>
<a name="line-734"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; findMax (fromList [(5,"a"), (3,"b")]) == (5,"a")</span>
<a name="line-744"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; deleteMin (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(5,"a"), (7,"c")]</span>
<a name="line-754"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; deleteMax (fromList [(5,"a"), (3,"b"), (7,"c")]) == fromList [(3,"b"), (5,"a")]</span>
<a name="line-764"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; updateMin (\ a -&gt; Just ("X" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3, "Xb"), (5, "a")]</span>
<a name="line-774"></a><span class='hs-comment'>-- &gt; updateMin (\ _ -&gt; 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'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; updateMax (\ a -&gt; Just ("X" ++ a)) (fromList [(5,"a"), (3,"b")]) == fromList [(3, "b"), (5, "Xa")]</span>
<a name="line-783"></a><span class='hs-comment'>-- &gt; updateMax (\ _ -&gt; 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'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; updateMinWithKey (\ k a -&gt; 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'>-- &gt; updateMinWithKey (\ _ _ -&gt; 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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; updateMaxWithKey (\ k a -&gt; 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'>-- &gt; updateMaxWithKey (\ _ _ -&gt; 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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; minViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((3,"b"), singleton 5 "a")</span>
<a name="line-822"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; maxViewWithKey (fromList [(5,"a"), (3,"b")]) == Just ((5,"a"), singleton 3 "b")</span>
<a name="line-832"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; minView (fromList [(5,"a"), (3,"b")]) == Just ("b", singleton 5 "a")</span>
<a name="line-843"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; maxView (fromList [(5,"a"), (3,"b")]) == Just ("a", singleton 3 "b")</span>
<a name="line-853"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>-- &gt;     == fromList [(3, "b"), (5, "a"), (7, "C")]</span>
<a name="line-871"></a><span class='hs-comment'>-- &gt; 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'>-- &gt;     == 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'>=&gt;</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'>-&gt;</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'>-- &gt; 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'>-- &gt;     == 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f key left_value right_value = (show key) ++ ":" ++ left_value ++ "|" ++ right_value</span>
<a name="line-932"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-941"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span>
<a name="line-942"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f al ar = if al == "b" then Just (al ++ ":" ++ ar) else Nothing</span>
<a name="line-994"></a><span class='hs-comment'>-- &gt; differenceWith f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (3, "B"), (7, "C")])</span>
<a name="line-995"></a><span class='hs-comment'>-- &gt;     == 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>-- &gt; differenceWithKey f (fromList [(5, "a"), (3, "b")]) (fromList [(5, "A"), (3, "B"), (10, "C")])</span>
<a name="line-1009"></a><span class='hs-comment'>-- &gt;     == 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span>
<a name="line-1019"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f k al ar = (show k) ++ ":" ++ al ++ "|" ++ ar</span>
<a name="line-1066"></a><span class='hs-comment'>-- &gt; 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 =&gt; (k -&gt; a -&gt; b -&gt; c) -&gt; Map k a -&gt; Map k b -&gt; 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 -&gt; merge tl tr</span>
<a name="line-1078"></a><span class='hs-comment'>--      Just y  -&gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;=</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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> &gt; isSubmapOfBy (==) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
<a name="line-1120"></a> &gt; isSubmapOfBy (&lt;=) (fromList [('a',1)]) (fromList [('a',1),('b',2)])
<a name="line-1121"></a> &gt; 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> &gt; isSubmapOfBy (==) (fromList [('a',2)]) (fromList [('a',1),('b',2)])
<a name="line-1126"></a> &gt; isSubmapOfBy (&lt;)  (fromList [('a',1)]) (fromList [('a',1),('b',2)])
<a name="line-1127"></a> &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>b</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;=</span> <span class='hs-varid'>size</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-varid'>y</span> <span class='hs-varop'>&amp;&amp;</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'>&amp;&amp;</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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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>  &gt; isProperSubmapOfBy (==) (fromList [(1,1)]) (fromList [(1,1),(2,2)])
<a name="line-1159"></a>  &gt; isProperSubmapOfBy (&lt;=) (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>  &gt; isProperSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1),(2,2)])
<a name="line-1164"></a>  &gt; isProperSubmapOfBy (==) (fromList [(1,1),(2,2)]) (fromList [(1,1)])
<a name="line-1165"></a>  &gt; isProperSubmapOfBy (&lt;)  (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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;</span> <span class='hs-varid'>size</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</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'>-- &gt; filter (&gt; "a") (fromList [(5,"a"), (3,"b")]) == singleton 3 "b"</span>
<a name="line-1179"></a><span class='hs-comment'>-- &gt; filter (&gt; "x") (fromList [(5,"a"), (3,"b")]) == empty</span>
<a name="line-1180"></a><span class='hs-comment'>-- &gt; filter (&lt; "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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; filterWithKey (\k _ -&gt; k &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; partition (&gt; "a") (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", singleton 5 "a")</span>
<a name="line-1203"></a><span class='hs-comment'>-- &gt; partition (&lt; "x") (fromList [(5,"a"), (3,"b")]) == (fromList [(3, "b"), (5, "a")], empty)</span>
<a name="line-1204"></a><span class='hs-comment'>-- &gt; partition (&gt; "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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; partitionWithKey (\ k _ -&gt; k &gt; 3) (fromList [(5,"a"), (3,"b")]) == (singleton 5 "a", singleton 3 "b")</span>
<a name="line-1215"></a><span class='hs-comment'>-- &gt; partitionWithKey (\ k _ -&gt; k &lt; 7) (fromList [(5,"a"), (3,"b")]) == (fromList [(3, "b"), (5, "a")], empty)</span>
<a name="line-1216"></a><span class='hs-comment'>-- &gt; partitionWithKey (\ k _ -&gt; k &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; let f x = if x == "a" then Just "new a" else Nothing</span>
<a name="line-1230"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f k _ = if k &lt; 5 then Just ("key : " ++ (show k)) else Nothing</span>
<a name="line-1238"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; let f a = if a &lt; "c" then Left a else Right a</span>
<a name="line-1251"></a><span class='hs-comment'>-- &gt; mapEither f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span>
<a name="line-1252"></a><span class='hs-comment'>-- &gt;     == (fromList [(3,"b"), (5,"a")], fromList [(1,"x"), (7,"z")])</span>
<a name="line-1253"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-1254"></a><span class='hs-comment'>-- &gt; mapEither (\ a -&gt; Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span>
<a name="line-1255"></a><span class='hs-comment'>-- &gt;     == (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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f k a = if k &lt; 5 then Left (k * 2) else Right (a ++ a)</span>
<a name="line-1264"></a><span class='hs-comment'>-- &gt; mapEitherWithKey f (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span>
<a name="line-1265"></a><span class='hs-comment'>-- &gt;     == (fromList [(1,2), (3,6)], fromList [(5,"aa"), (7,"zz")])</span>
<a name="line-1266"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-1267"></a><span class='hs-comment'>-- &gt; mapEitherWithKey (\_ a -&gt; Right a) (fromList [(5,"a"), (3,"b"), (1,"x"), (7,"z")])</span>
<a name="line-1268"></a><span class='hs-comment'>-- &gt;     == (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'>=&gt;</span>
<a name="line-1271"></a>  <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f key x = (show key) ++ ":" ++ x</span>
<a name="line-1293"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; let f a b = (a ++ b, b ++ "X")</span>
<a name="line-1305"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; let f a k b = (a ++ " " ++ (show k) ++ "-" ++ b, b ++ "X")</span>
<a name="line-1315"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; mapKeys (+ 1) (fromList [(5,"a"), (3,"b")])                        == fromList [(4, "b"), (6, "a")]</span>
<a name="line-1353"></a><span class='hs-comment'>-- &gt; mapKeys (\ _ -&gt; 1) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 1 "c"</span>
<a name="line-1354"></a><span class='hs-comment'>-- &gt; mapKeys (\ _ -&gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k1</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>k2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; mapKeysWith (++) (\ _ -&gt; 1) (fromList [(1,"b"), (2,"a"), (3,"d"), (4,"c")]) == singleton 1 "cdab"</span>
<a name="line-1367"></a><span class='hs-comment'>-- &gt; mapKeysWith (++) (\ _ -&gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k1</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>k2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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@ &lt; @y@ then @f x@ &lt; @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'>-- &gt; and [x &lt; y ==&gt; f x &lt; f y | x &lt;- ls, y &lt;- ls] </span>
<a name="line-1382"></a><span class='hs-comment'>-- &gt;                     ==&gt; mapKeysMonotonic f s == mapKeys f s</span>
<a name="line-1383"></a><span class='hs-comment'>-- &gt;     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'>-- &gt; mapKeysMonotonic (\ k -&gt; k * 2) (fromList [(5,"a"), (3,"b")]) == fromList [(6, "b"), (10, "a")]</span>
<a name="line-1389"></a><span class='hs-comment'>-- &gt; valid (mapKeysMonotonic (\ k -&gt; k * 2) (fromList [(5,"a"), (3,"b")])) == True</span>
<a name="line-1390"></a><span class='hs-comment'>-- &gt; valid (mapKeysMonotonic (\ _ -&gt; 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'>-&gt;</span><span class='hs-varid'>k2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k1</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-- &gt; elems map = fold (:) [] map</span>
<a name="line-1406"></a><span class='hs-comment'>--</span>
<a name="line-1407"></a><span class='hs-comment'>-- &gt; let f a len = len + (length a)</span>
<a name="line-1408"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; keys map = foldWithKey (\k x ks -&gt; k:ks) [] map</span>
<a name="line-1417"></a><span class='hs-comment'>--</span>
<a name="line-1418"></a><span class='hs-comment'>-- &gt; let f k a result = result ++ "(" ++ (show k) ++ ":" ++ a ++ ")"</span>
<a name="line-1419"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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 -&gt; k -&gt; a -&gt; b) -&gt; b -&gt; Map k a -&gt; 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'>-- &gt; elems (fromList [(5,"a"), (3,"b")]) == ["b","a"]</span>
<a name="line-1459"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>&lt;-</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'>-- &gt; keys (fromList [(5,"a"), (3,"b")]) == [3,5]</span>
<a name="line-1468"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>&lt;-</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'>-- &gt; keysSet (fromList [(5,"a"), (3,"b")]) == Data.Set.fromList [3,5]</span>
<a name="line-1477"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; assocs (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")]</span>
<a name="line-1485"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; fromList [] == empty</span>
<a name="line-1500"></a><span class='hs-comment'>-- &gt; fromList [(5,"a"), (3,"b"), (5, "c")] == fromList [(5,"c"), (3,"b")]</span>
<a name="line-1501"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</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'>-&gt;</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'>-- &gt; 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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; let f k a1 a2 = (show k) ++ a1 ++ a2</span>
<a name="line-1521"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; toList (fromList [(5,"a"), (3,"b")]) == [(3,"b"), (5,"a")]</span>
<a name="line-1533"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-- &gt; 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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; fromAscList [(3,"b"), (5,"a")]          == fromList [(3, "b"), (5, "a")]</span>
<a name="line-1560"></a><span class='hs-comment'>-- &gt; fromAscList [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "b")]</span>
<a name="line-1561"></a><span class='hs-comment'>-- &gt; valid (fromAscList [(3,"b"), (5,"a"), (5,"b")]) == True</span>
<a name="line-1562"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")] == fromList [(3, "b"), (5, "ba")]</span>
<a name="line-1572"></a><span class='hs-comment'>-- &gt; valid (fromAscListWith (++) [(3,"b"), (5,"a"), (5,"b")]) == True</span>
<a name="line-1573"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; let f k a1 a2 = (show k) ++ ":" ++ a1 ++ a2</span>
<a name="line-1584"></a><span class='hs-comment'>-- &gt; 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'>-- &gt; valid (fromAscListWithKey f [(3,"b"), (5,"a"), (5,"b"), (5,"b")]) == True</span>
<a name="line-1586"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; fromDistinctAscList [(3,"b"), (5,"a")] == fromList [(3, "b"), (5, "a")]</span>
<a name="line-1609"></a><span class='hs-comment'>-- &gt; valid (fromDistinctAscList [(3,"b"), (5,"a")])          == True</span>
<a name="line-1610"></a><span class='hs-comment'>-- &gt; 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'>-&gt;</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'>-&gt;</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'>-&gt;</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 &lt;[k] and all keys in [r] are &gt;[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'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>t</span>
<a name="line-1662"></a>              <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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 &gt;[k] from tree [t]
<a name="line-1678"></a>  [filterLt k t] filter all keys &lt;[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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; split 2 (fromList [(5,"a"), (3,"b")]) == (empty, fromList [(3,"b"), (5,"a")])</span>
<a name="line-1706"></a><span class='hs-comment'>-- &gt; split 3 (fromList [(5,"a"), (3,"b")]) == (empty, singleton 5 "a")</span>
<a name="line-1707"></a><span class='hs-comment'>-- &gt; split 4 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", singleton 5 "a")</span>
<a name="line-1708"></a><span class='hs-comment'>-- &gt; split 5 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", empty)</span>
<a name="line-1709"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; splitLookup 2 (fromList [(5,"a"), (3,"b")]) == (empty, Nothing, fromList [(3,"b"), (5,"a")])</span>
<a name="line-1724"></a><span class='hs-comment'>-- &gt; splitLookup 3 (fromList [(5,"a"), (3,"b")]) == (empty, Just "b", singleton 5 "a")</span>
<a name="line-1725"></a><span class='hs-comment'>-- &gt; splitLookup 4 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", Nothing, singleton 5 "a")</span>
<a name="line-1726"></a><span class='hs-comment'>-- &gt; splitLookup 5 (fromList [(5,"a"), (3,"b")]) == (singleton 3 "b", Just "a", empty)</span>
<a name="line-1727"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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] &lt; [k] and all values
<a name="line-1751"></a>  in [r] &gt; [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] &lt; 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 (&lt;=) comparisons instead
<a name="line-1770"></a>  of (&lt;) 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'>=&gt;</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;=</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'>&lt;=</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;=</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'>&lt;=</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'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&gt;</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'>-- &gt; 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'>-- &gt; 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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-- &gt; 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'>-- &gt; 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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;=</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'>&gt;=</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'>&gt;=</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'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;</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'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>&lt;</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'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>=&gt;</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'>&amp;&amp;</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'>=&gt;</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'>&lt;$&gt;</span> <span class='hs-varid'>traverse</span> <span class='hs-varid'>f</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;*&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>v</span> <span class='hs-varop'>&lt;*&gt;</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'>=&gt;</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'>&lt;-</span> <span class='hs-varid'>lexP</span>
<a name="line-1969"></a>    <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>&lt;-</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'>&gt;</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'>-&gt;</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'>&lt;-</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'>&lt;-</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'>=&gt;</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'>&gt;</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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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>&gt;  Map&gt; let t = fromDistinctAscList [(x,()) | x &lt;- [1..5]]
<a name="line-2002"></a>&gt;  Map&gt; putStrLn $ showTreeWith (\k x -&gt; show (k,x)) True False t
<a name="line-2003"></a>&gt;  (4,())
<a name="line-2004"></a>&gt;  +--(2,())
<a name="line-2005"></a>&gt;  |  +--(1,())
<a name="line-2006"></a>&gt;  |  +--(3,())
<a name="line-2007"></a>&gt;  +--(5,())
<a name="line-2008"></a>&gt;
<a name="line-2009"></a>&gt;  Map&gt; putStrLn $ showTreeWith (\k x -&gt; show (k,x)) True True t
<a name="line-2010"></a>&gt;  (4,())
<a name="line-2011"></a>&gt;  |
<a name="line-2012"></a>&gt;  +--(2,())
<a name="line-2013"></a>&gt;  |  |
<a name="line-2014"></a>&gt;  |  +--(1,())
<a name="line-2015"></a>&gt;  |  |
<a name="line-2016"></a>&gt;  |  +--(3,())
<a name="line-2017"></a>&gt;  |
<a name="line-2018"></a>&gt;  +--(5,())
<a name="line-2019"></a>&gt;
<a name="line-2020"></a>&gt;  Map&gt; putStrLn $ showTreeWith (\k x -&gt; show (k,x)) False True t
<a name="line-2021"></a>&gt;  +--(5,())
<a name="line-2022"></a>&gt;  |
<a name="line-2023"></a>&gt;  (4,())
<a name="line-2024"></a>&gt;  |
<a name="line-2025"></a>&gt;  |  +--(3,())
<a name="line-2026"></a>&gt;  |  |
<a name="line-2027"></a>&gt;  +--(2,())
<a name="line-2028"></a>&gt;     |
<a name="line-2029"></a>&gt;     +--(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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>id</span>
<a name="line-2072"></a>      <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-- &gt; valid (fromAscList [(3,"b"), (5,"a")]) == True</span>
<a name="line-2094"></a><span class='hs-comment'>-- &gt; 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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>k</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</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'>&amp;&amp;</span> <span class='hs-varid'>ordered</span> <span class='hs-varid'>t</span> <span class='hs-varop'>&amp;&amp;</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'>=&gt;</span> <span class='hs-conid'>Map</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</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'>-&gt;</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'>-&gt;</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'>&amp;&amp;</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'>&amp;&amp;</span> <span class='hs-varid'>bounded</span> <span class='hs-varid'>lo</span> <span class='hs-layout'>(</span><span class='hs-varop'>&lt;</span><span class='hs-varid'>kx</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>bounded</span> <span class='hs-layout'>(</span><span class='hs-varop'>&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>&lt;=</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'>&lt;=</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'>&amp;&amp;</span> <span class='hs-varid'>size</span> <span class='hs-varid'>r</span> <span class='hs-varop'>&lt;=</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'>&amp;&amp;</span>
<a name="line-2115"></a>                        <span class='hs-varid'>balanced</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&amp;&amp;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</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'>-&gt;</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>b</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</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>