This file is indexed.

/usr/share/doc/libghc-blaze-builder-doc/html/src/Blaze-ByteString-Builder-ByteString.html is in libghc-blaze-builder-doc 0.3.3.2-1.

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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
<?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>Blaze/ByteString/Builder/ByteString.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, BangPatterns, OverloadedStrings #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-cpp'>#ifdef USE_MONO_PAT_BINDS</span>
<a name="line-4"></a><span class='hs-comment'>{-# LANGUAGE MonoPatBinds #-}</span>
<a name="line-5"></a><span class='hs-cpp'>#endif</span>
<a name="line-6"></a>
<a name="line-7"></a><span class='hs-comment'>{-# OPTIONS_GHC -fno-warn-unused-imports #-}</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-comment'>-- |</span>
<a name="line-10"></a><span class='hs-comment'>-- Module      : Blaze.ByteString.Builder.ByteString</span>
<a name="line-11"></a><span class='hs-comment'>-- Copyright   : (c) 2010 Jasper Van der Jeugt &amp; Simon Meier</span>
<a name="line-12"></a><span class='hs-comment'>-- License     : BSD3-style (see LICENSE)</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>-- Maintainer  : Simon Meier &lt;iridcode@gmail.com&gt;</span>
<a name="line-15"></a><span class='hs-comment'>-- Stability   : experimental</span>
<a name="line-16"></a><span class='hs-comment'>-- Portability : tested on GHC only</span>
<a name="line-17"></a><span class='hs-comment'>--</span>
<a name="line-18"></a><span class='hs-comment'>-- 'Write's and 'Builder's for strict and lazy bytestrings.</span>
<a name="line-19"></a><span class='hs-comment'>--</span>
<a name="line-20"></a><span class='hs-comment'>-- We assume the following qualified imports in order to differentiate between</span>
<a name="line-21"></a><span class='hs-comment'>-- strict and lazy bytestrings in the code examples.</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>-- &gt; import qualified Data.ByteString      as S</span>
<a name="line-24"></a><span class='hs-comment'>-- &gt; import qualified Data.ByteString.Lazy as L</span>
<a name="line-25"></a><span class='hs-comment'>--</span>
<a name="line-26"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Blaze</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Builder</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-27"></a>    <span class='hs-layout'>(</span>
<a name="line-28"></a>    <span class='hs-comment'>-- * Strict bytestrings</span>
<a name="line-29"></a>      <span class='hs-varid'>writeByteString</span>
<a name="line-30"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>fromByteString</span>
<a name="line-31"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>fromByteStringWith</span>
<a name="line-32"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>copyByteString</span>
<a name="line-33"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>insertByteString</span>
<a name="line-34"></a>
<a name="line-35"></a>    <span class='hs-comment'>-- * Lazy bytestrings</span>
<a name="line-36"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>fromLazyByteString</span>
<a name="line-37"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>fromLazyByteStringWith</span>
<a name="line-38"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>copyLazyByteString</span>
<a name="line-39"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>insertLazyByteString</span>
<a name="line-40"></a>
<a name="line-41"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-42"></a>
<a name="line-43"></a><span class='hs-keyword'>import</span>           <span class='hs-conid'>Blaze</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Builder</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>insertByteString</span><span class='hs-layout'>)</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Blaze</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Builder</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>I</span>   <span class='hs-layout'>(</span><span class='hs-varid'>insertByteString</span><span class='hs-layout'>)</span>
<a name="line-45"></a>
<a name="line-46"></a><span class='hs-cpp'>#ifdef HAS_FOREIGN_UNSAFE_MODULE</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span>                   <span class='hs-layout'>(</span><span class='hs-varid'>withForeignPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>touchForeignPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>copyBytes</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>minusPtr</span><span class='hs-layout'>)</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span><span class='hs-varop'>.</span><span class='hs-conid'>ForeignPtr</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafeForeignPtrToPtr</span><span class='hs-layout'>)</span>
<a name="line-49"></a><span class='hs-cpp'>#else</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span>                   <span class='hs-layout'>(</span><span class='hs-varid'>unsafeForeignPtrToPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>withForeignPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>touchForeignPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>copyBytes</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusPtr</span><span class='hs-layout'>,</span> <span class='hs-varid'>minusPtr</span><span class='hs-layout'>)</span>
<a name="line-51"></a><span class='hs-cpp'>#endif</span>
<a name="line-52"></a>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Monoid</span>
<a name="line-54"></a>
<a name="line-55"></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'>ByteString</span>      <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-56"></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'>ByteString</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-57"></a>
<a name="line-58"></a><span class='hs-cpp'>#ifdef BYTESTRING_IN_BASE</span>
<a name="line-59"></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'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-60"></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'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Lazy</span><span class='hs-varop'>.</span><span class='hs-conid'>Base</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>L</span> <span class='hs-comment'>-- FIXME: check if this is the right module</span>
<a name="line-61"></a><span class='hs-cpp'>#else</span>
<a name="line-62"></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'>ByteString</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>      <span class='hs-keyword'>as</span> <span class='hs-conid'>S</span>
<a name="line-63"></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'>ByteString</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-keyword'>as</span> <span class='hs-conid'>L</span>
<a name="line-64"></a><span class='hs-cpp'>#endif</span>
<a name="line-65"></a>
<a name="line-66"></a>
<a name="line-67"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-68"></a><span class='hs-comment'>-- Strict ByteStrings</span>
<a name="line-69"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-70"></a>
<a name="line-71"></a><a name="writeByteString"></a><span class='hs-comment'>-- | Write a strict 'S.ByteString' to a buffer.</span>
<a name="line-72"></a><span class='hs-comment'>--</span>
<a name="line-73"></a><span class='hs-definition'>writeByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span>
<a name="line-74"></a><span class='hs-definition'>writeByteString</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exactWrite</span> <span class='hs-varid'>l</span> <span class='hs-varid'>io</span>
<a name="line-75"></a>  <span class='hs-keyword'>where</span>
<a name="line-76"></a>  <span class='hs-layout'>(</span><span class='hs-varid'>fptr</span><span class='hs-layout'>,</span> <span class='hs-varid'>o</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-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>toForeignPtr</span> <span class='hs-varid'>bs</span>
<a name="line-77"></a>  <span class='hs-varid'>io</span> <span class='hs-varid'>pf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withForeignPtr</span> <span class='hs-varid'>fptr</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>p</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>copyBytes</span> <span class='hs-varid'>pf</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span> <span class='hs-varid'>l</span>
<a name="line-78"></a><span class='hs-comment'>{-# INLINE writeByteString #-}</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="fromByteString"></a><span class='hs-comment'>-- | Smart serialization of a strict bytestring.</span>
<a name="line-81"></a><span class='hs-comment'>--</span>
<a name="line-82"></a><span class='hs-comment'>-- @'fromByteString' = 'fromByteStringWith' 'defaultMaximalCopySize'@</span>
<a name="line-83"></a><span class='hs-comment'>--</span>
<a name="line-84"></a><span class='hs-comment'>-- Use this function to serialize strict bytestrings. It guarantees an</span>
<a name="line-85"></a><span class='hs-comment'>-- average chunk size of 4kb, which has been shown to be a reasonable size in</span>
<a name="line-86"></a><span class='hs-comment'>-- benchmarks. Note that the check whether to copy or to insert is (almost)</span>
<a name="line-87"></a><span class='hs-comment'>-- free as the builder performance is mostly memory-bound.</span>
<a name="line-88"></a><span class='hs-comment'>--</span>
<a name="line-89"></a><span class='hs-comment'>-- If you statically know that copying or inserting the strict bytestring is</span>
<a name="line-90"></a><span class='hs-comment'>-- always the best choice, then you can use the 'copyByteString' or</span>
<a name="line-91"></a><span class='hs-comment'>-- 'insertByteString' functions.</span>
<a name="line-92"></a><span class='hs-comment'>--</span>
<a name="line-93"></a><span class='hs-definition'>fromByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-94"></a><span class='hs-definition'>fromByteString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromByteStringWith</span> <span class='hs-varid'>defaultMaximalCopySize</span>
<a name="line-95"></a><span class='hs-comment'>{-# INLINE fromByteString #-}</span>
<a name="line-96"></a>
<a name="line-97"></a>
<a name="line-98"></a><a name="fromByteStringWith"></a><span class='hs-comment'>-- | @fromByteStringWith maximalCopySize bs@ serializes the strict bytestring</span>
<a name="line-99"></a><span class='hs-comment'>-- @bs@ according to the following rules.</span>
<a name="line-100"></a><span class='hs-comment'>--</span>
<a name="line-101"></a><span class='hs-comment'>--   [@S.length bs &lt;= maximalCopySize@:] @bs@ is copied to the output buffer.</span>
<a name="line-102"></a><span class='hs-comment'>--</span>
<a name="line-103"></a><span class='hs-comment'>--   [@S.length bs &gt;  maximalCopySize@:] @bs@ the output buffer is flushed and</span>
<a name="line-104"></a><span class='hs-comment'>--   @bs@ is inserted directly as separate chunk in the output stream.</span>
<a name="line-105"></a><span class='hs-comment'>--</span>
<a name="line-106"></a><span class='hs-comment'>-- These rules guarantee that average chunk size in the output stream is at</span>
<a name="line-107"></a><span class='hs-comment'>-- least half the @maximalCopySize@.</span>
<a name="line-108"></a><span class='hs-comment'>--</span>
<a name="line-109"></a><span class='hs-definition'>fromByteStringWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>          <span class='hs-comment'>-- ^ Maximal number of bytes to copy.</span>
<a name="line-110"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-comment'>-- ^ Strict 'S.ByteString' to serialize.</span>
<a name="line-111"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>      <span class='hs-comment'>-- ^ Resulting 'Builder'.</span>
<a name="line-112"></a><span class='hs-definition'>fromByteStringWith</span> <span class='hs-varid'>maxCopySize</span> <span class='hs-keyglyph'>=</span>
<a name="line-113"></a>    <span class='hs-keyglyph'>\</span><span class='hs-varid'>bs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fromBuildStepCont</span> <span class='hs-varop'>$</span> <span class='hs-varid'>step</span> <span class='hs-varid'>bs</span>
<a name="line-114"></a>  <span class='hs-keyword'>where</span>
<a name="line-115"></a>    <span class='hs-varid'>step</span> <span class='hs-varop'>!</span><span class='hs-varid'>bs</span> <span class='hs-varop'>!</span><span class='hs-varid'>k</span> <span class='hs-varid'>br</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>BufRange</span> <span class='hs-varop'>!</span><span class='hs-varid'>op</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-116"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>maxCopySize</span> <span class='hs-varop'>&lt;</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-varid'>length</span> <span class='hs-varid'>bs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>I</span><span class='hs-varop'>.</span><span class='hs-varid'>insertByteString</span> <span class='hs-varid'>op</span> <span class='hs-varid'>bs</span> <span class='hs-varid'>k</span>
<a name="line-117"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>copyByteStringStep</span> <span class='hs-varid'>bs</span> <span class='hs-varid'>k</span> <span class='hs-varid'>br</span>
<a name="line-118"></a><span class='hs-comment'>{-# INLINE fromByteStringWith #-}</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="copyByteString"></a><span class='hs-comment'>-- | @copyByteString bs@ serialize the strict bytestring @bs@ by copying it to</span>
<a name="line-121"></a><span class='hs-comment'>-- the output buffer.</span>
<a name="line-122"></a><span class='hs-comment'>--</span>
<a name="line-123"></a><span class='hs-comment'>-- Use this function to serialize strict bytestrings that are statically known</span>
<a name="line-124"></a><span class='hs-comment'>-- to be smallish (@&lt;= 4kb@).</span>
<a name="line-125"></a><span class='hs-comment'>--</span>
<a name="line-126"></a><span class='hs-definition'>copyByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-127"></a><span class='hs-definition'>copyByteString</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>bs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fromBuildStepCont</span> <span class='hs-varop'>$</span> <span class='hs-varid'>copyByteStringStep</span> <span class='hs-varid'>bs</span>
<a name="line-128"></a><span class='hs-comment'>{-# INLINE copyByteString #-}</span>
<a name="line-129"></a>
<a name="line-130"></a><a name="copyByteStringStep"></a><span class='hs-definition'>copyByteStringStep</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span>
<a name="line-131"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>BufRange</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>BuildSignal</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-132"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>BufRange</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>BuildSignal</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-133"></a><span class='hs-definition'>copyByteStringStep</span> <span class='hs-layout'>(</span><span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>PS</span> <span class='hs-varid'>ifp</span> <span class='hs-varid'>ioff</span> <span class='hs-varid'>isize</span><span class='hs-layout'>)</span> <span class='hs-varop'>!</span><span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span>
<a name="line-134"></a>    <span class='hs-varid'>goBS</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafeForeignPtrToPtr</span> <span class='hs-varid'>ifp</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>ioff</span><span class='hs-layout'>)</span>
<a name="line-135"></a>  <span class='hs-keyword'>where</span>
<a name="line-136"></a>    <span class='hs-varop'>!</span><span class='hs-varid'>ipe</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unsafeForeignPtrToPtr</span> <span class='hs-varid'>ifp</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-layout'>(</span><span class='hs-varid'>ioff</span> <span class='hs-varop'>+</span> <span class='hs-varid'>isize</span><span class='hs-layout'>)</span>
<a name="line-137"></a>    <span class='hs-varid'>goBS</span> <span class='hs-varop'>!</span><span class='hs-varid'>ip</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>BufRange</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ope</span><span class='hs-layout'>)</span>
<a name="line-138"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>inpRemaining</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>outRemaining</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-139"></a>          <span class='hs-varid'>copyBytes</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ip</span> <span class='hs-varid'>inpRemaining</span>
<a name="line-140"></a>          <span class='hs-varid'>touchForeignPtr</span> <span class='hs-varid'>ifp</span> <span class='hs-comment'>-- input consumed: OK to release from here</span>
<a name="line-141"></a>          <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>br'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>BufRange</span> <span class='hs-layout'>(</span><span class='hs-varid'>op</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>inpRemaining</span><span class='hs-layout'>)</span> <span class='hs-varid'>ope</span>
<a name="line-142"></a>          <span class='hs-varid'>k</span> <span class='hs-varid'>br'</span>
<a name="line-143"></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-144"></a>          <span class='hs-varid'>copyBytes</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ip</span> <span class='hs-varid'>outRemaining</span>
<a name="line-145"></a>          <span class='hs-keyword'>let</span> <span class='hs-varop'>!</span><span class='hs-varid'>ip'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ip</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>outRemaining</span>
<a name="line-146"></a>          <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>bufferFull</span> <span class='hs-num'>1</span> <span class='hs-varid'>ope</span> <span class='hs-layout'>(</span><span class='hs-varid'>goBS</span> <span class='hs-varid'>ip'</span><span class='hs-layout'>)</span>
<a name="line-147"></a>      <span class='hs-keyword'>where</span>
<a name="line-148"></a>        <span class='hs-varid'>outRemaining</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ope</span> <span class='hs-varop'>`minusPtr`</span> <span class='hs-varid'>op</span>
<a name="line-149"></a>        <span class='hs-varid'>inpRemaining</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ipe</span> <span class='hs-varop'>`minusPtr`</span> <span class='hs-varid'>ip</span>
<a name="line-150"></a><span class='hs-comment'>{-# INLINE copyByteStringStep #-}</span>
<a name="line-151"></a>
<a name="line-152"></a><a name="insertByteString"></a><span class='hs-comment'>-- | @insertByteString bs@ serializes the strict bytestring @bs@ by inserting</span>
<a name="line-153"></a><span class='hs-comment'>-- it directly as a chunk of the output stream.</span>
<a name="line-154"></a><span class='hs-comment'>--</span>
<a name="line-155"></a><span class='hs-comment'>-- Note that this implies flushing the output buffer; even if it contains just</span>
<a name="line-156"></a><span class='hs-comment'>-- a single byte. Hence, you should use this operation only for large (@&gt; 8kb@)</span>
<a name="line-157"></a><span class='hs-comment'>-- bytestrings, as otherwise the resulting output stream may be too fragmented</span>
<a name="line-158"></a><span class='hs-comment'>-- to be processed efficiently.</span>
<a name="line-159"></a><span class='hs-comment'>--</span>
<a name="line-160"></a><span class='hs-definition'>insertByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>S</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-161"></a><span class='hs-definition'>insertByteString</span> <span class='hs-keyglyph'>=</span>
<a name="line-162"></a>    <span class='hs-keyglyph'>\</span><span class='hs-varid'>bs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fromBuildStepCont</span> <span class='hs-varop'>$</span> <span class='hs-varid'>step</span> <span class='hs-varid'>bs</span>
<a name="line-163"></a>  <span class='hs-keyword'>where</span>
<a name="line-164"></a>    <span class='hs-varid'>step</span> <span class='hs-varop'>!</span><span class='hs-varid'>bs</span> <span class='hs-varop'>!</span><span class='hs-varid'>k</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>BufRange</span> <span class='hs-varid'>op</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>I</span><span class='hs-varop'>.</span><span class='hs-varid'>insertByteString</span> <span class='hs-varid'>op</span> <span class='hs-varid'>bs</span> <span class='hs-varid'>k</span>
<a name="line-165"></a><span class='hs-comment'>{-# INLINE insertByteString #-}</span>
<a name="line-166"></a>
<a name="line-167"></a>
<a name="line-168"></a><span class='hs-comment'>-- Lazy bytestrings</span>
<a name="line-169"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-170"></a>
<a name="line-171"></a><a name="fromLazyByteString"></a><span class='hs-comment'>-- | /O(n)/. Smart serialization of a lazy bytestring.</span>
<a name="line-172"></a><span class='hs-comment'>--</span>
<a name="line-173"></a><span class='hs-comment'>-- @'fromLazyByteString' = 'fromLazyByteStringWith' 'defaultMaximalCopySize'@</span>
<a name="line-174"></a><span class='hs-comment'>--</span>
<a name="line-175"></a><span class='hs-comment'>-- Use this function to serialize lazy bytestrings. It guarantees an average</span>
<a name="line-176"></a><span class='hs-comment'>-- chunk size of 4kb, which has been shown to be a reasonable size in</span>
<a name="line-177"></a><span class='hs-comment'>-- benchmarks. Note that the check whether to copy or to insert is (almost)</span>
<a name="line-178"></a><span class='hs-comment'>-- free as the builder performance is mostly memory-bound.</span>
<a name="line-179"></a><span class='hs-comment'>--</span>
<a name="line-180"></a><span class='hs-comment'>-- If you statically know that copying or inserting /all/ chunks of the lazy</span>
<a name="line-181"></a><span class='hs-comment'>-- bytestring is always the best choice, then you can use the</span>
<a name="line-182"></a><span class='hs-comment'>-- 'copyLazyByteString' or 'insertLazyByteString' functions.</span>
<a name="line-183"></a><span class='hs-comment'>--</span>
<a name="line-184"></a><span class='hs-definition'>fromLazyByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-185"></a><span class='hs-definition'>fromLazyByteString</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromLazyByteStringWith</span> <span class='hs-varid'>defaultMaximalCopySize</span>
<a name="line-186"></a><span class='hs-comment'>{-# INLINE fromLazyByteString #-}</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="fromLazyByteStringWith"></a><span class='hs-comment'>-- | /O(n)/. Serialize a lazy bytestring chunk-wise according to the same rules</span>
<a name="line-189"></a><span class='hs-comment'>-- as in 'fromByteStringWith'.</span>
<a name="line-190"></a><span class='hs-comment'>--</span>
<a name="line-191"></a><span class='hs-comment'>-- Semantically, it holds that</span>
<a name="line-192"></a><span class='hs-comment'>--</span>
<a name="line-193"></a><span class='hs-comment'>-- &gt;   fromLazyByteStringWith maxCopySize</span>
<a name="line-194"></a><span class='hs-comment'>-- &gt; = mconcat . map (fromByteStringWith maxCopySize) . L.toChunks</span>
<a name="line-195"></a><span class='hs-comment'>--</span>
<a name="line-196"></a><span class='hs-comment'>-- However, the left-hand-side is much more efficient, as it moves the</span>
<a name="line-197"></a><span class='hs-comment'>-- end-of-buffer pointer out of the inner loop and provides the compiler with</span>
<a name="line-198"></a><span class='hs-comment'>-- more strictness information.</span>
<a name="line-199"></a><span class='hs-comment'>--</span>
<a name="line-200"></a><span class='hs-definition'>fromLazyByteStringWith</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>          <span class='hs-comment'>-- ^ Maximal number of bytes to copy.</span>
<a name="line-201"></a>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-comment'>-- ^ Lazy 'L.ByteString' to serialize.</span>
<a name="line-202"></a>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>      <span class='hs-comment'>-- ^ Resulting 'Builder'.</span>
<a name="line-203"></a><span class='hs-definition'>fromLazyByteStringWith</span> <span class='hs-varid'>maxCopySize</span> <span class='hs-keyglyph'>=</span>
<a name="line-204"></a>  <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>foldrChunks</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>bs</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fromByteStringWith</span> <span class='hs-varid'>maxCopySize</span> <span class='hs-varid'>bs</span> <span class='hs-varop'>`mappend`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-varid'>mempty</span>
<a name="line-205"></a><span class='hs-comment'>{-# INLINE fromLazyByteStringWith #-}</span>
<a name="line-206"></a>
<a name="line-207"></a>
<a name="line-208"></a><a name="copyLazyByteString"></a><span class='hs-comment'>-- | /O(n)/. Serialize a lazy bytestring by copying /all/ chunks sequentially</span>
<a name="line-209"></a><span class='hs-comment'>-- to the output buffer.</span>
<a name="line-210"></a><span class='hs-comment'>--</span>
<a name="line-211"></a><span class='hs-comment'>-- See 'copyByteString' for usage considerations.</span>
<a name="line-212"></a><span class='hs-comment'>--</span>
<a name="line-213"></a><span class='hs-definition'>copyLazyByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-214"></a><span class='hs-definition'>copyLazyByteString</span> <span class='hs-keyglyph'>=</span>
<a name="line-215"></a>  <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>foldrChunks</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>bs</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>copyByteString</span> <span class='hs-varid'>bs</span> <span class='hs-varop'>`mappend`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-varid'>mempty</span>
<a name="line-216"></a><span class='hs-comment'>{-# INLINE copyLazyByteString #-}</span>
<a name="line-217"></a>
<a name="line-218"></a><a name="insertLazyByteString"></a><span class='hs-comment'>-- | /O(n)/. Serialize a lazy bytestring by inserting /all/ its chunks directly</span>
<a name="line-219"></a><span class='hs-comment'>-- into the output stream.</span>
<a name="line-220"></a><span class='hs-comment'>--</span>
<a name="line-221"></a><span class='hs-comment'>-- See 'insertByteString' for usage considerations.</span>
<a name="line-222"></a><span class='hs-comment'>--</span>
<a name="line-223"></a><span class='hs-comment'>-- For library developers, see the 'ModifyChunks' build signal, if you</span>
<a name="line-224"></a><span class='hs-comment'>-- need an /O(1)/ lazy bytestring insert based on difference lists.</span>
<a name="line-225"></a><span class='hs-comment'>--</span>
<a name="line-226"></a><span class='hs-definition'>insertLazyByteString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-conid'>ByteString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-227"></a><span class='hs-definition'>insertLazyByteString</span> <span class='hs-keyglyph'>=</span>
<a name="line-228"></a>  <span class='hs-conid'>L</span><span class='hs-varop'>.</span><span class='hs-varid'>foldrChunks</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>bs</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>insertByteString</span> <span class='hs-varid'>bs</span> <span class='hs-varop'>`mappend`</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-varid'>mempty</span>
<a name="line-229"></a><span class='hs-comment'>{-# INLINE insertLazyByteString #-}</span>
<a name="line-230"></a>
</pre></body>
</html>