This file is indexed.

/usr/share/doc/libghc-missingh-doc/html/src/Data-BinPacking.html is in libghc-missingh-doc 1.3.0.1-5build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?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://code.haskell.org/~malcolm/hscolour/ -->
<title>src/Data/BinPacking.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-
<a name="line-2"></a>Copyright (c) 2008-2011 John Goerzen &lt;jgoerzen@complete.org&gt;
<a name="line-3"></a>
<a name="line-4"></a>All rights reserved.
<a name="line-5"></a>
<a name="line-6"></a>For license and copyright information, see the file LICENSE
<a name="line-7"></a>-}</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-comment'>{- |
<a name="line-10"></a>   Module     : Data.BinPacking
<a name="line-11"></a>   Copyright  : Copyright (C) 2008-2011 John Goerzen
<a name="line-12"></a>   License    : BSD3
<a name="line-13"></a>
<a name="line-14"></a>   Maintainer : John Goerzen &lt;jgoerzen@complete.org&gt; 
<a name="line-15"></a>   Stability  : provisional
<a name="line-16"></a>   Portability: portable
<a name="line-17"></a>
<a name="line-18"></a>Tools for packing into bins
<a name="line-19"></a>
<a name="line-20"></a>Written by John Goerzen, jgoerzen\@complete.org
<a name="line-21"></a>
<a name="line-22"></a>This module is designed to solve this type of problem: Given a bunch of
<a name="line-23"></a>objects of varying sizes, what is the best possible way to pack them into
<a name="line-24"></a>fixed-size bins?  This can be used, for instance, by the datapacker program
<a name="line-25"></a>to pack files onto CDs or DVDs; by manufacturing environments to pack
<a name="line-26"></a>physical items into physicl bins; etc.
<a name="line-27"></a>
<a name="line-28"></a>A description of bin packing algorithms can be found at
<a name="line-29"></a>&lt;<a href="http://en.wikipedia.org/wiki/Bin_packing_problem">http://en.wikipedia.org/wiki/Bin_packing_problem</a>&gt;.
<a name="line-30"></a>-}</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>BinPacking</span> <span class='hs-layout'>(</span><span class='hs-conid'>BinPacker</span><span class='hs-layout'>,</span>
<a name="line-33"></a>                        <span class='hs-conid'>BinPackerError</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-34"></a>                        <span class='hs-varid'>packByOrder</span><span class='hs-layout'>,</span>
<a name="line-35"></a>                        <span class='hs-varid'>packLargeFirst</span>
<a name="line-36"></a>                       <span class='hs-layout'>)</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-keyword'>where</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Error</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="BinPackerError"></a><span class='hs-comment'>{- | Potential errors returned as Left values by 'BinPacker' functions. 
<a name="line-43"></a>Calling 'show' on this value will produce a nice error message suitable for
<a name="line-44"></a>display. -}</span>
<a name="line-45"></a><a name="BinPackerError"></a><span class='hs-keyword'>data</span> <span class='hs-layout'>(</span><span class='hs-conid'>Num</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>BinPackerError</span> <span class='hs-varid'>size</span> <span class='hs-varid'>obj</span> <span class='hs-keyglyph'>=</span> 
<a name="line-46"></a>    <span class='hs-conid'>BPTooFewBins</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>                <span class='hs-comment'>-- ^ Ran out of bins; attached value is the list of objects that do not fit</span>
<a name="line-47"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BPSizeTooLarge</span> <span class='hs-varid'>size</span> <span class='hs-layout'>(</span><span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span>   <span class='hs-comment'>-- ^ Bin size1 exceeded by at least the given object and size</span>
<a name="line-48"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BPOther</span> <span class='hs-conid'>String</span>                    <span class='hs-comment'>-- ^ Other error</span>
<a name="line-49"></a>      <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Read</span><span class='hs-layout'>)</span>
<a name="line-50"></a>
<a name="line-51"></a><a name="instance%20Show%20(BinPackerError%20size%20obj)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Num</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>obj</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'>BinPackerError</span> <span class='hs-varid'>size</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-52"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>BPTooFewBins</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Too few bins"</span>
<a name="line-53"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>BPSizeTooLarge</span> <span class='hs-varid'>binsize</span> <span class='hs-layout'>(</span><span class='hs-varid'>objsize</span><span class='hs-layout'>,</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-54"></a>        <span class='hs-str'>"Size "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>objsize</span> <span class='hs-varop'>++</span> <span class='hs-str'>" greater than bin size "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>binsize</span>
<a name="line-55"></a>        <span class='hs-varop'>++</span> <span class='hs-str'>" at "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-varid'>obj</span>
<a name="line-56"></a>    <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>BPOther</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span>
<a name="line-57"></a>
<a name="line-58"></a><a name="instance%20Error%20(BinPackerError%20size%20obj)"></a><span class='hs-comment'>{- | Let us use this as part of the Either monad -}</span>
<a name="line-59"></a><a name="instance%20Error%20(BinPackerError%20size%20obj)"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Num</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Error</span> <span class='hs-layout'>(</span><span class='hs-conid'>BinPackerError</span> <span class='hs-varid'>size</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-60"></a>    <span class='hs-varid'>strMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BPOther</span>
<a name="line-61"></a>
<a name="line-62"></a><a name="BinPacker"></a><span class='hs-comment'>{- | The primary type for bin-packing functions.
<a name="line-63"></a>
<a name="line-64"></a>These functions take a list of size of bins.  If every bin is the same size,
<a name="line-65"></a>you can pass @repeat binSize@ to pass an infinite list of bins if the
<a name="line-66"></a>same size.  Any surplus bins will simply be ignored. 
<a name="line-67"></a>
<a name="line-68"></a>&gt; [size] is the sizes of bins
<a name="line-69"></a>&gt; [(size, obj)] is the sizes and objects
<a name="line-70"></a>&gt; result is Either error or results
<a name="line-71"></a>-}</span>
<a name="line-72"></a><a name="BinPacker"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>BinPacker</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Num</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> 
<a name="line-73"></a>                  <span class='hs-keyglyph'>[</span><span class='hs-varid'>size</span><span class='hs-keyglyph'>]</span>        <span class='hs-comment'>-- The sizes of bins</span>
<a name="line-74"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- The sizes and objects</span>
<a name="line-75"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-layout'>(</span><span class='hs-conid'>BinPackerError</span> <span class='hs-varid'>size</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>size</span><span class='hs-layout'>,</span> <span class='hs-varid'>obj</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- Either error or results</span>
<a name="line-76"></a>
<a name="line-77"></a>
<a name="line-78"></a><a name="packByOrder"></a><span class='hs-comment'>{- | Pack objects into bins, preserving order.  Objects will be taken from the
<a name="line-79"></a>input list one by one, and added to each bin until the bin is full.  Work will
<a name="line-80"></a>then proceed on the next bin.  No attempt is made to optimize allocations to
<a name="line-81"></a>bins.  This is the simplest and most naive bin-packing algorithm, but
<a name="line-82"></a>may not make very good use of bin space. -}</span>
<a name="line-83"></a><span class='hs-definition'>packByOrder</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BinPacker</span>
<a name="line-84"></a><span class='hs-definition'>packByOrder</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span>                     <span class='hs-comment'>-- Ran out of sizes</span>
<a name="line-85"></a><span class='hs-definition'>packByOrder</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>remainder</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-conid'>BPTooFewBins</span> <span class='hs-varid'>remainder</span><span class='hs-layout'>)</span>
<a name="line-86"></a><span class='hs-definition'>packByOrder</span> <span class='hs-layout'>(</span><span class='hs-varid'>thisbinsize</span><span class='hs-conop'>:</span><span class='hs-varid'>otherbins</span><span class='hs-layout'>)</span> <span class='hs-varid'>sizes</span> <span class='hs-keyglyph'>=</span>
<a name="line-87"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>fillBin</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span>
<a name="line-88"></a>        <span class='hs-varid'>fillBin</span> <span class='hs-varid'>accumsize</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</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-89"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>thisbinsize</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-varop'>$</span> <span class='hs-conid'>BPSizeTooLarge</span> <span class='hs-varid'>thisbinsize</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span>
<a name="line-90"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>s</span> <span class='hs-varop'>+</span> <span class='hs-varid'>accumsize</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>thisbinsize</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span>
<a name="line-91"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>next</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fillBin</span> <span class='hs-layout'>(</span><span class='hs-varid'>accumsize</span> <span class='hs-varop'>+</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
<a name="line-92"></a>                             <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>next</span>
<a name="line-93"></a>        <span class='hs-keyword'>in</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>thisset</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fillBin</span> <span class='hs-num'>0</span> <span class='hs-varid'>sizes</span>
<a name="line-94"></a>              <span class='hs-varid'>next</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>packByOrder</span> <span class='hs-varid'>otherbins</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>thisset</span><span class='hs-layout'>)</span> <span class='hs-varid'>sizes</span><span class='hs-layout'>)</span>
<a name="line-95"></a>              <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>thisset</span> <span class='hs-conop'>:</span> <span class='hs-varid'>next</span><span class='hs-layout'>)</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="packLargeFirst"></a><span class='hs-comment'>{- | Pack objects into bins.  For each bin, start with the largest objects,
<a name="line-98"></a>and keep packing the largest object from the remainder until no object can
<a name="line-99"></a>be found to put in the bin.  This is substantially more efficient than
<a name="line-100"></a>'packByOrder', but requires sorting the input. -}</span>
<a name="line-101"></a><span class='hs-definition'>packLargeFirst</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BinPacker</span>
<a name="line-102"></a><span class='hs-definition'>packLargeFirst</span> <span class='hs-varid'>bins</span> <span class='hs-varid'>sizes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>packLargeFirst'</span> <span class='hs-varid'>bins</span> <span class='hs-layout'>(</span><span class='hs-varid'>sortBy</span> <span class='hs-varid'>fstSort</span> <span class='hs-varid'>sizes</span><span class='hs-layout'>)</span>
<a name="line-103"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>fstSort</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>compare</span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-104"></a>
<a name="line-105"></a><a name="packLargeFirst'"></a><span class='hs-definition'>packLargeFirst'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BinPacker</span>
<a name="line-106"></a><span class='hs-definition'>packLargeFirst'</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span>                     <span class='hs-comment'>-- Ran out of sizes</span>
<a name="line-107"></a><span class='hs-definition'>packLargeFirst'</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>remainder</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-conid'>BPTooFewBins</span> <span class='hs-varid'>remainder</span><span class='hs-layout'>)</span>
<a name="line-108"></a><span class='hs-definition'>packLargeFirst'</span> <span class='hs-layout'>(</span><span class='hs-varid'>thisbinsize</span><span class='hs-conop'>:</span><span class='hs-varid'>otherbins</span><span class='hs-layout'>)</span> <span class='hs-varid'>sizes</span> <span class='hs-keyglyph'>=</span>
<a name="line-109"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>fillBin</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span>
<a name="line-110"></a>        <span class='hs-varid'>fillBin</span> <span class='hs-varid'>accumsize</span> <span class='hs-varid'>sizelist</span> <span class='hs-keyglyph'>=</span>
<a name="line-111"></a>            <span class='hs-keyword'>case</span> <span class='hs-varid'>break</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-varid'>accumsize</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>thisbinsize</span><span class='hs-layout'>)</span> <span class='hs-varid'>sizelist</span> <span class='hs-keyword'>of</span>
<a name="line-112"></a>              <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-113"></a>                  <span class='hs-keyword'>if</span> <span class='hs-varid'>accumsize</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-114"></a>                     <span class='hs-keyword'>then</span> <span class='hs-conid'>Left</span> <span class='hs-varop'>$</span> <span class='hs-conid'>BPSizeTooLarge</span> <span class='hs-varid'>thisbinsize</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varid'>sizelist</span><span class='hs-layout'>)</span>
<a name="line-115"></a>                     <span class='hs-keyword'>else</span> <span class='hs-conid'>Right</span> <span class='hs-conid'>[]</span>
<a name="line-116"></a>              <span class='hs-layout'>(</span><span class='hs-varid'>nonmatches</span><span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>matchxs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-117"></a>                  <span class='hs-keyword'>do</span> <span class='hs-varid'>next</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fillBin</span> <span class='hs-layout'>(</span><span class='hs-varid'>accumsize</span> <span class='hs-varop'>+</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>nonmatches</span> <span class='hs-varop'>++</span> <span class='hs-varid'>matchxs</span><span class='hs-layout'>)</span>
<a name="line-118"></a>                     <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>next</span>
<a name="line-119"></a>        <span class='hs-keyword'>in</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>thisset</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fillBin</span> <span class='hs-num'>0</span> <span class='hs-varid'>sizes</span>
<a name="line-120"></a>              <span class='hs-varid'>next</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>packLargeFirst'</span> <span class='hs-varid'>otherbins</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>thisset</span><span class='hs-layout'>)</span> <span class='hs-varid'>sizes</span><span class='hs-layout'>)</span>
<a name="line-121"></a>              <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>thisset</span> <span class='hs-conop'>:</span> <span class='hs-varid'>next</span><span class='hs-layout'>)</span>
</pre></body>
</html>