Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 53be4b908f5603d39c263bea2a996239 > files > 123

ghc-text-devel-0.8.1.0-1.fc14.1.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/Text/Lazy/Builder.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE BangPatterns, CPP, Rank2Types #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-4"></a><span class='hs-comment'>-- |</span>
<a name="line-5"></a><span class='hs-comment'>-- Module      : Data.Text.Lazy.Builder</span>
<a name="line-6"></a><span class='hs-comment'>-- Copyright   : (c) 2010 Johan Tibell</span>
<a name="line-7"></a><span class='hs-comment'>-- License     : BSD3-style (see LICENSE)</span>
<a name="line-8"></a><span class='hs-comment'>-- </span>
<a name="line-9"></a><span class='hs-comment'>-- Maintainer  : Johan Tibell &lt;johan.tibell@gmail.com&gt;</span>
<a name="line-10"></a><span class='hs-comment'>-- Stability   : experimental</span>
<a name="line-11"></a><span class='hs-comment'>-- Portability : portable to Hugs and GHC</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>-- Efficient construction of lazy texts.</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Lazy</span><span class='hs-varop'>.</span><span class='hs-conid'>Builder</span>
<a name="line-18"></a>   <span class='hs-layout'>(</span> <span class='hs-comment'>-- * The Builder type</span>
<a name="line-19"></a>     <span class='hs-conid'>Builder</span>
<a name="line-20"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>toLazyText</span>
<a name="line-21"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>toLazyTextWith</span>
<a name="line-22"></a>
<a name="line-23"></a>     <span class='hs-comment'>-- * Constructing Builders</span>
<a name="line-24"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>singleton</span>
<a name="line-25"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>fromText</span>
<a name="line-26"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>fromLazyText</span>
<a name="line-27"></a>
<a name="line-28"></a>     <span class='hs-comment'>-- * Flushing the buffer state</span>
<a name="line-29"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>flush</span>
<a name="line-30"></a>   <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-31"></a>
<a name="line-32"></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'>ST</span> <span class='hs-layout'>(</span><span class='hs-conid'>ST</span><span class='hs-layout'>,</span> <span class='hs-varid'>runST</span><span class='hs-layout'>)</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Bits</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varop'>.&amp;.</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-34"></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-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span> <span class='hs-layout'>(</span><span class='hs-conid'>Text</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Lazy</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span> <span class='hs-layout'>(</span><span class='hs-varid'>smallChunkSize</span><span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span> <span class='hs-layout'>(</span><span class='hs-varid'>inlineInterleaveST</span><span class='hs-layout'>)</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>UnsafeChar</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span><span class='hs-layout'>,</span> <span class='hs-varid'>unsafeWrite</span><span class='hs-layout'>)</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'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>UnsafeShift</span> <span class='hs-layout'>(</span><span class='hs-varid'>shiftR</span><span class='hs-layout'>)</span>
<a name="line-40"></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'>map</span><span class='hs-layout'>,</span> <span class='hs-varid'>putChar</span><span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></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'>String</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>String</span>
<a name="line-43"></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'>Text</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-44"></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'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>A</span>
<a name="line-45"></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'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Lazy</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>L</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="Builder"></a><span class='hs-comment'>-- | A 'Builder' is an efficient way to build lazy 'L.Text's.  There</span>
<a name="line-50"></a><a name="Builder"></a><span class='hs-comment'>-- are several functions for constructing 'Builder's, but only one to</span>
<a name="line-51"></a><a name="Builder"></a><span class='hs-comment'>-- inspect them: to extract any data, you have to turn them into lazy</span>
<a name="line-52"></a><a name="Builder"></a><span class='hs-comment'>-- 'L.Text's using 'toLazyText'.</span>
<a name="line-53"></a><a name="Builder"></a><span class='hs-comment'>--</span>
<a name="line-54"></a><a name="Builder"></a><span class='hs-comment'>-- Internally, a 'Builder' constructs a lazy 'L.Text' by filling byte</span>
<a name="line-55"></a><a name="Builder"></a><span class='hs-comment'>-- arrays piece by piece.  As each buffer is filled, it is \'popped\'</span>
<a name="line-56"></a><a name="Builder"></a><span class='hs-comment'>-- off, to become a new chunk of the resulting lazy 'L.Text'.  All</span>
<a name="line-57"></a><a name="Builder"></a><span class='hs-comment'>-- this is hidden from the user of the 'Builder'.</span>
<a name="line-58"></a><a name="Builder"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Builder</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-layout'>{</span>
<a name="line-59"></a>     <span class='hs-comment'>-- Invariant (from Data.Text.Lazy):</span>
<a name="line-60"></a>     <span class='hs-comment'>--      The lists include no null Texts.</span>
<a name="line-61"></a>     <span class='hs-varid'>runBuilder</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyword'>forall</span> <span class='hs-varid'>s</span><span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ST</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-62"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span>
<a name="line-63"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ST</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span>
<a name="line-64"></a>   <span class='hs-layout'>}</span>
<a name="line-65"></a>
<a name="line-66"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monoid</span> <span class='hs-conid'>Builder</span> <span class='hs-keyword'>where</span>
<a name="line-67"></a>   <span class='hs-varid'>mempty</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-68"></a>   <span class='hs-comment'>{-# INLINE mempty #-}</span>
<a name="line-69"></a>   <span class='hs-varid'>mappend</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>append</span>
<a name="line-70"></a>   <span class='hs-comment'>{-# INLINE mappend #-}</span>
<a name="line-71"></a>
<a name="line-72"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>String</span><span class='hs-varop'>.</span><span class='hs-conid'>IsString</span> <span class='hs-conid'>Builder</span> <span class='hs-keyword'>where</span>
<a name="line-73"></a>    <span class='hs-varid'>fromString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromString</span>
<a name="line-74"></a>    <span class='hs-comment'>{-# INLINE fromString #-}</span>
<a name="line-75"></a>
<a name="line-76"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>Builder</span> <span class='hs-keyword'>where</span>
<a name="line-77"></a>    <span class='hs-varid'>show</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>unpack</span> <span class='hs-varop'>.</span> <span class='hs-varid'>toLazyText</span>
<a name="line-78"></a>
<a name="line-79"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-80"></a>
<a name="line-81"></a><a name="empty"></a><span class='hs-comment'>-- | /O(1)./ The empty Builder, satisfying</span>
<a name="line-82"></a><span class='hs-comment'>--</span>
<a name="line-83"></a><span class='hs-comment'>--  * @'toLazyText' 'empty' = 'L.empty'@</span>
<a name="line-84"></a><span class='hs-comment'>--</span>
<a name="line-85"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Builder</span>
<a name="line-86"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-varid'>id</span>
<a name="line-87"></a><span class='hs-comment'>{-# INLINE empty #-}</span>
<a name="line-88"></a>
<a name="line-89"></a><a name="singleton"></a><span class='hs-comment'>-- | /O(1)./ A Builder taking a single character, satisfying</span>
<a name="line-90"></a><span class='hs-comment'>--</span>
<a name="line-91"></a><span class='hs-comment'>--  * @'toLazyText' ('singleton' c) = 'L.singleton' c@</span>
<a name="line-92"></a><span class='hs-comment'>--</span>
<a name="line-93"></a><span class='hs-definition'>singleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-94"></a><span class='hs-definition'>singleton</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putChar</span> <span class='hs-varid'>c</span>
<a name="line-95"></a><span class='hs-comment'>{-# INLINE singleton #-}</span>
<a name="line-96"></a>
<a name="line-97"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-98"></a>
<a name="line-99"></a><a name="append"></a><span class='hs-comment'>-- | /O(1)./ The concatenation of two Builders, an associative</span>
<a name="line-100"></a><span class='hs-comment'>-- operation with identity 'empty', satisfying</span>
<a name="line-101"></a><span class='hs-comment'>--</span>
<a name="line-102"></a><span class='hs-comment'>--  * @'toLazyText' ('append' x y) = 'L.append' ('toLazyText' x) ('toLazyText' y)@</span>
<a name="line-103"></a><span class='hs-comment'>--</span>
<a name="line-104"></a><span class='hs-definition'>append</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Builder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-105"></a><span class='hs-definition'>append</span> <span class='hs-layout'>(</span><span class='hs-conid'>Builder</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Builder</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span>
<a name="line-106"></a><span class='hs-comment'>{-# INLINE [0] append #-}</span>
<a name="line-107"></a>
<a name="line-108"></a><a name="copyLimit"></a><span class='hs-comment'>-- TODO: Experiment to find the right threshold.</span>
<a name="line-109"></a><span class='hs-definition'>copyLimit</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-110"></a><span class='hs-definition'>copyLimit</span> <span class='hs-keyglyph'>=</span>  <span class='hs-num'>128</span>                                 
<a name="line-111"></a>
<a name="line-112"></a><span class='hs-comment'>-- This function attempts to merge small Texts instead of treating the</span>
<a name="line-113"></a><span class='hs-comment'>-- text as its own chunk.  We may not always want this.</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="fromText"></a><span class='hs-comment'>-- | /O(1)./ A Builder taking a 'S.Text', satisfying</span>
<a name="line-116"></a><span class='hs-comment'>--</span>
<a name="line-117"></a><span class='hs-comment'>--  * @'toLazyText' ('fromText' t) = 'L.fromChunks' [t]@</span>
<a name="line-118"></a><span class='hs-comment'>--</span>
<a name="line-119"></a><span class='hs-definition'>fromText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-120"></a><span class='hs-definition'>fromText</span> <span class='hs-varid'>t</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-121"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>null</span> <span class='hs-varid'>t</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-122"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>copyLimit</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeN</span> <span class='hs-varid'>l</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>copyI</span> <span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-varop'>+</span><span class='hs-varid'>o</span><span class='hs-layout'>)</span>
<a name="line-123"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flush</span> <span class='hs-varop'>`append`</span> <span class='hs-varid'>mapBuilder</span> <span class='hs-layout'>(</span><span class='hs-varid'>t</span> <span class='hs-conop'>:</span><span class='hs-layout'>)</span>
<a name="line-124"></a><span class='hs-comment'>{-# INLINE [1] fromText #-}</span>
<a name="line-125"></a>
<a name="line-126"></a><span class='hs-comment'>{-# RULES
<a name="line-127"></a>"fromText/pack" forall s .
<a name="line-128"></a>        fromText (S.pack s) = fromString s
<a name="line-129"></a> #-}</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="fromString"></a><span class='hs-comment'>-- | /O(1)./ A Builder taking a 'String', satisfying</span>
<a name="line-132"></a><span class='hs-comment'>--</span>
<a name="line-133"></a><span class='hs-comment'>--  * @'toLazyText' ('fromString' s) = 'L.fromChunks' [S.pack s]@</span>
<a name="line-134"></a><span class='hs-comment'>--</span>
<a name="line-135"></a><span class='hs-definition'>fromString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-136"></a><span class='hs-definition'>fromString</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>p0</span> <span class='hs-varid'>o0</span> <span class='hs-varid'>u0</span> <span class='hs-varid'>l0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-137"></a>    <span class='hs-keyword'>let</span> <span class='hs-varid'>loop</span> <span class='hs-varop'>!</span><span class='hs-varid'>marr</span> <span class='hs-varop'>!</span><span class='hs-varid'>o</span> <span class='hs-varop'>!</span><span class='hs-varid'>u</span> <span class='hs-varop'>!</span><span class='hs-varid'>l</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-varid'>u</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-138"></a>        <span class='hs-varid'>loop</span> <span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-varid'>u</span> <span class='hs-varid'>l</span> <span class='hs-varid'>s</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>cs</span><span class='hs-layout'>)</span>
<a name="line-139"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>l</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-140"></a>                <span class='hs-varid'>arr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeFreeze</span> <span class='hs-varid'>marr</span>
<a name="line-141"></a>                <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>o</span> <span class='hs-varid'>u</span>
<a name="line-142"></a>                <span class='hs-varid'>marr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeNew</span> <span class='hs-varid'>chunkSize</span>
<a name="line-143"></a>                <span class='hs-varid'>ts</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>inlineInterleaveST</span> <span class='hs-layout'>(</span><span class='hs-varid'>loop</span> <span class='hs-varid'>marr'</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-varid'>chunkSize</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-144"></a>                <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>t</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ts</span>
<a name="line-145"></a>            <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-146"></a>                <span class='hs-varid'>n</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>marr</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-varop'>+</span><span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-varid'>c</span>
<a name="line-147"></a>                <span class='hs-varid'>loop</span> <span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-layout'>(</span><span class='hs-varid'>u</span><span class='hs-varop'>+</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-comment'>-</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varid'>cs</span>
<a name="line-148"></a>    <span class='hs-keyword'>in</span> <span class='hs-varid'>loop</span> <span class='hs-varid'>p0</span> <span class='hs-varid'>o0</span> <span class='hs-varid'>u0</span> <span class='hs-varid'>l0</span> <span class='hs-varid'>str</span>
<a name="line-149"></a>  <span class='hs-keyword'>where</span>
<a name="line-150"></a>    <span class='hs-varid'>chunkSize</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>smallChunkSize</span>
<a name="line-151"></a><span class='hs-comment'>{-# INLINE fromString #-}</span>
<a name="line-152"></a>
<a name="line-153"></a><a name="fromLazyText"></a><span class='hs-comment'>-- | /O(1)./ A Builder taking a lazy 'L.Text', satisfying</span>
<a name="line-154"></a><span class='hs-comment'>--</span>
<a name="line-155"></a><span class='hs-comment'>--  * @'toLazyText' ('fromLazyText' t) = t@</span>
<a name="line-156"></a><span class='hs-comment'>--</span>
<a name="line-157"></a><span class='hs-definition'>fromLazyText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-158"></a><span class='hs-definition'>fromLazyText</span> <span class='hs-varid'>ts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flush</span> <span class='hs-varop'>`append`</span> <span class='hs-varid'>mapBuilder</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>toChunks</span> <span class='hs-varid'>ts</span> <span class='hs-varop'>++</span><span class='hs-layout'>)</span>
<a name="line-159"></a><span class='hs-comment'>{-# INLINE fromLazyText #-}</span>
<a name="line-160"></a>
<a name="line-161"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-162"></a>
<a name="line-163"></a><a name="Buffer"></a><span class='hs-comment'>-- Our internal buffer type</span>
<a name="line-164"></a><a name="Buffer"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Buffer</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>MArray</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-165"></a>                       <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>  <span class='hs-comment'>-- offset</span>
<a name="line-166"></a>                       <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>  <span class='hs-comment'>-- used units</span>
<a name="line-167"></a>                       <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>  <span class='hs-comment'>-- length left</span>
<a name="line-168"></a>
<a name="line-169"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-170"></a>
<a name="line-171"></a><a name="toLazyText"></a><span class='hs-comment'>-- | /O(n)./ Extract a lazy 'L.Text' from a 'Builder' with a default</span>
<a name="line-172"></a><span class='hs-comment'>-- buffer size.  The construction work takes place if and when the</span>
<a name="line-173"></a><span class='hs-comment'>-- relevant part of the lazy 'L.Text' is demanded.</span>
<a name="line-174"></a><span class='hs-definition'>toLazyText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Builder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span>
<a name="line-175"></a><span class='hs-definition'>toLazyText</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toLazyTextWith</span> <span class='hs-varid'>smallChunkSize</span>
<a name="line-176"></a>
<a name="line-177"></a><a name="toLazyTextWith"></a><span class='hs-comment'>-- | /O(n)./ Extract a lazy 'L.Text' from a 'Builder', using the given</span>
<a name="line-178"></a><span class='hs-comment'>-- size for the initial buffer.  The construction work takes place if</span>
<a name="line-179"></a><span class='hs-comment'>-- and when the relevant part of the lazy 'L.Text' is demanded.</span>
<a name="line-180"></a><span class='hs-comment'>--</span>
<a name="line-181"></a><span class='hs-comment'>-- If the initial buffer is too small to hold all data, subsequent</span>
<a name="line-182"></a><span class='hs-comment'>-- buffers will be the default buffer size.</span>
<a name="line-183"></a><span class='hs-definition'>toLazyTextWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span>
<a name="line-184"></a><span class='hs-definition'>toLazyTextWith</span> <span class='hs-varid'>chunkSize</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>fromChunks</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runST</span> <span class='hs-varop'>$</span>
<a name="line-185"></a>  <span class='hs-varid'>newBuffer</span> <span class='hs-varid'>chunkSize</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>runBuilder</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varop'>`append`</span> <span class='hs-varid'>flush</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-186"></a>
<a name="line-187"></a><a name="flush"></a><span class='hs-comment'>-- | /O(1)./ Pop the 'S.Text' we have constructed so far, if any,</span>
<a name="line-188"></a><span class='hs-comment'>-- yielding a new chunk in the result lazy 'L.Text'.</span>
<a name="line-189"></a><span class='hs-definition'>flush</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Builder</span>
<a name="line-190"></a><span class='hs-definition'>flush</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>k</span> <span class='hs-varid'>buf</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>p</span> <span class='hs-varid'>o</span> <span class='hs-varid'>u</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-191"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>u</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>
<a name="line-192"></a>    <span class='hs-keyword'>then</span> <span class='hs-varid'>k</span> <span class='hs-varid'>buf</span>
<a name="line-193"></a>    <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>arr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeFreeze</span> <span class='hs-varid'>p</span>
<a name="line-194"></a>            <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Buffer</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-varop'>+</span><span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-num'>0</span> <span class='hs-varid'>l</span>
<a name="line-195"></a>                <span class='hs-varop'>!</span><span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>o</span> <span class='hs-varid'>u</span>
<a name="line-196"></a>            <span class='hs-varid'>ts</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>inlineInterleaveST</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-197"></a>            <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>t</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ts</span>
<a name="line-198"></a>
<a name="line-199"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-200"></a>
<a name="line-201"></a><a name="withBuffer"></a><span class='hs-comment'>-- | Sequence an ST operation on the buffer</span>
<a name="line-202"></a><span class='hs-definition'>withBuffer</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>s</span><span class='hs-varop'>.</span> <span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ST</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-203"></a><span class='hs-definition'>withBuffer</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>k</span> <span class='hs-varid'>buf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varid'>buf</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span>
<a name="line-204"></a><span class='hs-comment'>{-# INLINE withBuffer #-}</span>
<a name="line-205"></a>
<a name="line-206"></a><a name="withSize"></a><span class='hs-comment'>-- | Get the size of the buffer</span>
<a name="line-207"></a><span class='hs-definition'>withSize</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-208"></a><span class='hs-definition'>withSize</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>k</span> <span class='hs-varid'>buf</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Buffer</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-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-209"></a>    <span class='hs-varid'>runBuilder</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-varid'>k</span> <span class='hs-varid'>buf</span>
<a name="line-210"></a><span class='hs-comment'>{-# INLINE withSize #-}</span>
<a name="line-211"></a>
<a name="line-212"></a><a name="mapBuilder"></a><span class='hs-comment'>-- | Map the resulting list of texts.</span>
<a name="line-213"></a><span class='hs-definition'>mapBuilder</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-214"></a><span class='hs-definition'>mapBuilder</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varop'>.</span><span class='hs-layout'>)</span>
<a name="line-215"></a>
<a name="line-216"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-217"></a>
<a name="line-218"></a><a name="putChar"></a><span class='hs-definition'>putChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-219"></a><span class='hs-definition'>putChar</span> <span class='hs-varid'>c</span>
<a name="line-220"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0x10000</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeN</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-221"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeN</span> <span class='hs-num'>2</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-222"></a>          <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>marr</span> <span class='hs-varid'>o</span> <span class='hs-varid'>lo</span>
<a name="line-223"></a>          <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeWrite</span> <span class='hs-varid'>marr</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>hi</span>
<a name="line-224"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span>
<a name="line-225"></a>        <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span> <span class='hs-comment'>-</span> <span class='hs-num'>0x10000</span>
<a name="line-226"></a>        <span class='hs-varid'>lo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varop'>`shiftR`</span> <span class='hs-num'>10</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-num'>0xD800</span>
<a name="line-227"></a>        <span class='hs-varid'>hi</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-num'>0x3FF</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-num'>0xDC00</span>
<a name="line-228"></a><span class='hs-comment'>{-# INLINE putChar #-}</span>
<a name="line-229"></a>
<a name="line-230"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-231"></a>
<a name="line-232"></a><a name="ensureFree"></a><span class='hs-comment'>-- | Ensure that there are at least @n@ many elements available.</span>
<a name="line-233"></a><span class='hs-definition'>ensureFree</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-234"></a><a name="!"></a><span class='hs-definition'>ensureFree</span> <span class='hs-varop'>!</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withSize</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-235"></a>    <span class='hs-keyword'>if</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>l</span>
<a name="line-236"></a>    <span class='hs-keyword'>then</span> <span class='hs-varid'>empty</span>
<a name="line-237"></a>    <span class='hs-keyword'>else</span> <span class='hs-varid'>flush</span> <span class='hs-varop'>`append'`</span> <span class='hs-varid'>withBuffer</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-layout'>(</span><span class='hs-varid'>newBuffer</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-varid'>n</span> <span class='hs-varid'>smallChunkSize</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-238"></a><span class='hs-comment'>{-# INLINE [0] ensureFree #-}</span>
<a name="line-239"></a>
<a name="line-240"></a><a name="writeN"></a><span class='hs-comment'>-- | Ensure that @n@ many elements are available, and then use @f@ to</span>
<a name="line-241"></a><span class='hs-comment'>-- write some elements into the memory.</span>
<a name="line-242"></a><span class='hs-definition'>writeN</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyword'>forall</span> <span class='hs-varid'>s</span><span class='hs-varop'>.</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>MArray</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ST</span> <span class='hs-varid'>s</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-243"></a><span class='hs-definition'>writeN</span> <span class='hs-varid'>n</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ensureFree</span> <span class='hs-varid'>n</span> <span class='hs-varop'>`append'`</span> <span class='hs-varid'>withBuffer</span> <span class='hs-layout'>(</span><span class='hs-varid'>writeNBuffer</span> <span class='hs-varid'>n</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span>
<a name="line-244"></a><span class='hs-comment'>{-# INLINE [0] writeN #-}</span>
<a name="line-245"></a>
<a name="line-246"></a><a name="writeNBuffer"></a><span class='hs-definition'>writeNBuffer</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>MArray</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ST</span> <span class='hs-varid'>s</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-247"></a>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ST</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-248"></a><span class='hs-definition'>writeNBuffer</span> <span class='hs-varid'>n</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>p</span> <span class='hs-varid'>o</span> <span class='hs-varid'>u</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-249"></a>    <span class='hs-varid'>f</span> <span class='hs-varid'>p</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-varop'>+</span><span class='hs-varid'>u</span><span class='hs-layout'>)</span>
<a name="line-250"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Buffer</span> <span class='hs-varid'>p</span> <span class='hs-varid'>o</span> <span class='hs-layout'>(</span><span class='hs-varid'>u</span><span class='hs-varop'>+</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>l</span><span class='hs-comment'>-</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-251"></a><span class='hs-comment'>{-# INLINE writeNBuffer #-}</span>
<a name="line-252"></a>
<a name="line-253"></a><a name="newBuffer"></a><span class='hs-definition'>newBuffer</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ST</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-conid'>Buffer</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-254"></a><span class='hs-definition'>newBuffer</span> <span class='hs-varid'>size</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-255"></a>    <span class='hs-varid'>arr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeNew</span> <span class='hs-varid'>size</span>
<a name="line-256"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Buffer</span> <span class='hs-varid'>arr</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span> <span class='hs-varid'>size</span>
<a name="line-257"></a><span class='hs-comment'>{-# INLINE newBuffer #-}</span>
<a name="line-258"></a>
<a name="line-259"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-260"></a><span class='hs-comment'>-- Some nice rules for Builder</span>
<a name="line-261"></a>
<a name="line-262"></a><a name="append'"></a><span class='hs-comment'>-- This function makes GHC understand that 'writeN' and 'ensureFree'</span>
<a name="line-263"></a><span class='hs-comment'>-- are *not* recursive in the precense of the rewrite rules below.</span>
<a name="line-264"></a><span class='hs-comment'>-- This is not needed with GHC 6.14+.</span>
<a name="line-265"></a><span class='hs-definition'>append'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Builder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-266"></a><span class='hs-definition'>append'</span> <span class='hs-layout'>(</span><span class='hs-conid'>Builder</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Builder</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Builder</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>g</span><span class='hs-layout'>)</span>
<a name="line-267"></a><span class='hs-comment'>{-# INLINE append' #-}</span>
<a name="line-268"></a>
<a name="line-269"></a><span class='hs-comment'>{-# RULES
<a name="line-270"></a>
<a name="line-271"></a>"append/writeN" forall a b (f::forall s. A.MArray s -&gt; Int -&gt; ST s ())
<a name="line-272"></a>                           (g::forall s. A.MArray s -&gt; Int -&gt; ST s ()) ws.
<a name="line-273"></a>        append (writeN a f) (append (writeN b g) ws) =
<a name="line-274"></a>            append (writeN (a+b) (\marr o -&gt; f marr o &gt;&gt; g marr (o+a))) ws
<a name="line-275"></a>
<a name="line-276"></a>"writeN/writeN" forall a b (f::forall s. A.MArray s -&gt; Int -&gt; ST s ())
<a name="line-277"></a>                           (g::forall s. A.MArray s -&gt; Int -&gt; ST s ()).
<a name="line-278"></a>        append (writeN a f) (writeN b g) =
<a name="line-279"></a>            writeN (a+b) (\marr o -&gt; f marr o &gt;&gt; g marr (o+a))
<a name="line-280"></a>
<a name="line-281"></a>"ensureFree/ensureFree" forall a b .
<a name="line-282"></a>        append (ensureFree a) (ensureFree b) = ensureFree (max a b)
<a name="line-283"></a>
<a name="line-284"></a>"flush/flush"
<a name="line-285"></a>        append flush flush = flush
<a name="line-286"></a>
<a name="line-287"></a> #-}</span>
</pre></body>
</html>