This file is indexed.

/usr/share/doc/libghc-blaze-builder-doc/html/src/Blaze-ByteString-Builder-Internal-Write.html is in libghc-blaze-builder-doc 0.4.0.1-3build1.

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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
<?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/Internal/Write.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, MonoPatBinds #-}</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'>-- Module      : Blaze.ByteString.Builder.Internal.Poke</span>
<a name="line-5"></a><span class='hs-comment'>-- Copyright   : (c) 2010 Simon Meier</span>
<a name="line-6"></a><span class='hs-comment'>--               (c) 2010 Jasper van der Jeugt</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  : Leon Smith &lt;leon@melding-monads.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 : tested on GHC only</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>-- A general and efficient write type that allows for the easy construction of</span>
<a name="line-14"></a><span class='hs-comment'>-- builders for (smallish) bounded size writes to a buffer.</span>
<a name="line-15"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><span class='hs-comment'>-- FIXME: Improve documentation.</span>
<a name="line-17"></a><span class='hs-comment'>--</span>
<a name="line-18"></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'>Internal</span><span class='hs-varop'>.</span><span class='hs-conid'>Write</span> <span class='hs-layout'>(</span>
<a name="line-19"></a>  <span class='hs-comment'>-- * Poking a buffer</span>
<a name="line-20"></a>    <span class='hs-conid'>Poke</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-21"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>pokeN</span>
<a name="line-22"></a>
<a name="line-23"></a>  <span class='hs-comment'>-- * Writing to abuffer</span>
<a name="line-24"></a>  <span class='hs-layout'>,</span> <span class='hs-conid'>Write</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-25"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>runWrite</span>
<a name="line-26"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>getBound</span>
<a name="line-27"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>getBound'</span>
<a name="line-28"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>getPoke</span>
<a name="line-29"></a>
<a name="line-30"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>exactWrite</span>
<a name="line-31"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>boundedWrite</span>
<a name="line-32"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>writeLiftIO</span>
<a name="line-33"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>writeIf</span>
<a name="line-34"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>writeEq</span>
<a name="line-35"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>writeOrdering</span>
<a name="line-36"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>writeOrd</span>
<a name="line-37"></a>
<a name="line-38"></a>  <span class='hs-comment'>-- * Constructing builders from writes</span>
<a name="line-39"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>fromWrite</span>
<a name="line-40"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>fromWriteSingleton</span>
<a name="line-41"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>fromWriteList</span>
<a name="line-42"></a>
<a name="line-43"></a>  <span class='hs-comment'>-- * Writing 'Storable's</span>
<a name="line-44"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>writeStorable</span>
<a name="line-45"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>fromStorable</span>
<a name="line-46"></a>  <span class='hs-layout'>,</span> <span class='hs-varid'>fromStorables</span>
<a name="line-47"></a>
<a name="line-48"></a>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-49"></a>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Foreign</span>
<a name="line-51"></a>
<a name="line-52"></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-53"></a>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-55"></a>
<a name="line-56"></a><span class='hs-keyword'>import</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'>Builder</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-59"></a><span class='hs-comment'>-- Poking a buffer and writing to a buffer</span>
<a name="line-60"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-61"></a>
<a name="line-62"></a><span class='hs-comment'>-- Sadly GHC is not smart enough: code where we branch and each branch should</span>
<a name="line-63"></a><span class='hs-comment'>-- execute a few IO actions and then return a value cannot be taught to GHC. At</span>
<a name="line-64"></a><span class='hs-comment'>-- least not such that it returns the value of the branches unpacked.</span>
<a name="line-65"></a><span class='hs-comment'>--</span>
<a name="line-66"></a><span class='hs-comment'>-- Hmm.. at least he behaves much better for the Monoid instance of Write</span>
<a name="line-67"></a><span class='hs-comment'>-- than the one for Poke. Serializing UTF-8 chars gets a slowdown of a</span>
<a name="line-68"></a><span class='hs-comment'>-- factor 2 when 2 chars are composed. Perhaps I should try out the writeList</span>
<a name="line-69"></a><span class='hs-comment'>-- instances also, as they may be more sensitive to to much work per Char.</span>
<a name="line-70"></a><span class='hs-comment'>--</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="Poke"></a><span class='hs-comment'>-- | Changing a sequence of bytes starting from the given pointer. 'Poke's are</span>
<a name="line-73"></a><a name="Poke"></a><span class='hs-comment'>-- the most primitive buffer manipulation. In most cases, you don't use the</span>
<a name="line-74"></a><a name="Poke"></a><span class='hs-comment'>-- explicitely but as part of a 'Write', which also tells how many bytes will</span>
<a name="line-75"></a><a name="Poke"></a><span class='hs-comment'>-- be changed at most.</span>
<a name="line-76"></a><a name="Poke"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Poke</span> <span class='hs-keyglyph'>=</span>
<a name="line-77"></a>    <span class='hs-conid'>Poke</span> <span class='hs-layout'>{</span> <span class='hs-varid'>runPoke</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-78"></a>
<a name="line-79"></a><a name="Write"></a><span class='hs-comment'>-- | A write of a bounded number of bytes.</span>
<a name="line-80"></a><a name="Write"></a><span class='hs-comment'>--</span>
<a name="line-81"></a><a name="Write"></a><span class='hs-comment'>-- When defining a function @write :: a -&gt; Write@ for some @a@, then it is</span>
<a name="line-82"></a><a name="Write"></a><span class='hs-comment'>-- important to ensure that the bound on the number of bytes written is</span>
<a name="line-83"></a><a name="Write"></a><span class='hs-comment'>-- data-independent. Formally,</span>
<a name="line-84"></a><a name="Write"></a><span class='hs-comment'>--</span>
<a name="line-85"></a><a name="Write"></a><span class='hs-comment'>--  @ forall x y. getBound (write x) = getBound (write y) @</span>
<a name="line-86"></a><a name="Write"></a><span class='hs-comment'>--</span>
<a name="line-87"></a><a name="Write"></a><span class='hs-comment'>-- The idea is that this data-independent bound is specified such that the</span>
<a name="line-88"></a><a name="Write"></a><span class='hs-comment'>-- compiler can optimize the check, if there are enough free bytes in the buffer,</span>
<a name="line-89"></a><a name="Write"></a><span class='hs-comment'>-- to a single subtraction between the pointer to the next free byte and the</span>
<a name="line-90"></a><a name="Write"></a><span class='hs-comment'>-- pointer to the end of the buffer with this constant bound of the maximal</span>
<a name="line-91"></a><a name="Write"></a><span class='hs-comment'>-- number of bytes to be written.</span>
<a name="line-92"></a><a name="Write"></a><span class='hs-comment'>--</span>
<a name="line-93"></a><a name="Write"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Write</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Write</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <span class='hs-conid'>Poke</span>
<a name="line-94"></a>
<a name="line-95"></a><a name="getPoke"></a><span class='hs-comment'>-- | Extract the 'Poke' action of a write.</span>
<a name="line-96"></a><span class='hs-comment'>{-# INLINE getPoke #-}</span>
<a name="line-97"></a><span class='hs-definition'>getPoke</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Write</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Poke</span>
<a name="line-98"></a><span class='hs-definition'>getPoke</span> <span class='hs-layout'>(</span><span class='hs-conid'>Write</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>wio</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wio</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="runWrite"></a><span class='hs-comment'>-- | Run the 'Poke' action of a write.</span>
<a name="line-101"></a><span class='hs-comment'>{-# INLINE runWrite #-}</span>
<a name="line-102"></a><span class='hs-definition'>runWrite</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Write</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span><span class='hs-layout'>)</span>
<a name="line-103"></a><span class='hs-definition'>runWrite</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runPoke</span> <span class='hs-varop'>.</span> <span class='hs-varid'>getPoke</span>
<a name="line-104"></a>
<a name="line-105"></a><a name="getBound"></a><span class='hs-comment'>-- | Extract the maximal number of bytes that this write could write.</span>
<a name="line-106"></a><span class='hs-comment'>{-# INLINE getBound #-}</span>
<a name="line-107"></a><span class='hs-definition'>getBound</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Write</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-108"></a><span class='hs-definition'>getBound</span> <span class='hs-layout'>(</span><span class='hs-conid'>Write</span> <span class='hs-varid'>bound</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bound</span>
<a name="line-109"></a>
<a name="line-110"></a><a name="getBound'"></a><span class='hs-comment'>-- | Extract the maximal number of bytes that this write could write in any</span>
<a name="line-111"></a><span class='hs-comment'>-- case. Assumes that the bound of the write is data-independent.</span>
<a name="line-112"></a><span class='hs-comment'>{-# INLINE getBound' #-}</span>
<a name="line-113"></a><span class='hs-definition'>getBound'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>             <span class='hs-comment'>-- ^ Name of caller: for debugging purposes.</span>
<a name="line-114"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-115"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-116"></a><span class='hs-definition'>getBound'</span> <span class='hs-varid'>msg</span> <span class='hs-varid'>write</span> <span class='hs-keyglyph'>=</span>
<a name="line-117"></a>    <span class='hs-varid'>getBound</span> <span class='hs-varop'>$</span> <span class='hs-varid'>write</span> <span class='hs-varop'>$</span> <span class='hs-varid'>error</span> <span class='hs-varop'>$</span>
<a name="line-118"></a>    <span class='hs-str'>"getBound' called from "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>msg</span> <span class='hs-varop'>++</span> <span class='hs-str'>": write bound is not data-independent."</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="instance%20Monoid%20Poke"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monoid</span> <span class='hs-conid'>Poke</span> <span class='hs-keyword'>where</span>
<a name="line-121"></a>  <span class='hs-comment'>{-# INLINE mempty #-}</span>
<a name="line-122"></a>  <span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Poke</span> <span class='hs-varop'>$</span> <span class='hs-varid'>return</span>
<a name="line-123"></a>
<a name="line-124"></a>  <span class='hs-comment'>{-# INLINE mappend #-}</span>
<a name="line-125"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Poke</span> <span class='hs-varid'>po1</span><span class='hs-layout'>)</span> <span class='hs-varop'>`mappend`</span> <span class='hs-layout'>(</span><span class='hs-conid'>Poke</span> <span class='hs-varid'>po2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Poke</span> <span class='hs-varop'>$</span> <span class='hs-varid'>po1</span> <span class='hs-varop'>&gt;=&gt;</span> <span class='hs-varid'>po2</span>
<a name="line-126"></a>
<a name="line-127"></a>  <span class='hs-comment'>{-# INLINE mconcat #-}</span>
<a name="line-128"></a>  <span class='hs-varid'>mconcat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>mappend</span> <span class='hs-varid'>mempty</span>
<a name="line-129"></a>
<a name="line-130"></a><a name="instance%20Monoid%20Write"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monoid</span> <span class='hs-conid'>Write</span> <span class='hs-keyword'>where</span>
<a name="line-131"></a>  <span class='hs-comment'>{-# INLINE mempty #-}</span>
<a name="line-132"></a>  <span class='hs-varid'>mempty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Write</span> <span class='hs-num'>0</span> <span class='hs-varid'>mempty</span>
<a name="line-133"></a>
<a name="line-134"></a>  <span class='hs-comment'>{-# INLINE mappend #-}</span>
<a name="line-135"></a>  <span class='hs-layout'>(</span><span class='hs-conid'>Write</span> <span class='hs-varid'>bound1</span> <span class='hs-varid'>w1</span><span class='hs-layout'>)</span> <span class='hs-varop'>`mappend`</span> <span class='hs-layout'>(</span><span class='hs-conid'>Write</span> <span class='hs-varid'>bound2</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-136"></a>    <span class='hs-conid'>Write</span> <span class='hs-layout'>(</span><span class='hs-varid'>bound1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>bound2</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>w1</span> <span class='hs-varop'>`mappend`</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span>
<a name="line-137"></a>
<a name="line-138"></a>  <span class='hs-comment'>{-# INLINE mconcat #-}</span>
<a name="line-139"></a>  <span class='hs-varid'>mconcat</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>mappend</span> <span class='hs-varid'>mempty</span>
<a name="line-140"></a>
<a name="line-141"></a>
<a name="line-142"></a><a name="pokeN"></a><span class='hs-comment'>-- | @pokeN size io@ creates a write that denotes the writing of @size@ bytes</span>
<a name="line-143"></a><span class='hs-comment'>-- to a buffer using the IO action @io@. Note that @io@ MUST write EXACTLY @size@</span>
<a name="line-144"></a><span class='hs-comment'>-- bytes to the buffer!</span>
<a name="line-145"></a><span class='hs-comment'>{-# INLINE pokeN #-}</span>
<a name="line-146"></a><span class='hs-definition'>pokeN</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-147"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Poke</span>
<a name="line-148"></a><span class='hs-definition'>pokeN</span> <span class='hs-varid'>size</span> <span class='hs-varid'>io</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Poke</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>op</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>io</span> <span class='hs-varid'>op</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-layout'>(</span><span class='hs-varid'>op</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>size</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-149"></a>
<a name="line-150"></a>
<a name="line-151"></a><a name="exactWrite"></a><span class='hs-comment'>-- | @exactWrite size io@ creates a bounded write that can later be converted to</span>
<a name="line-152"></a><span class='hs-comment'>-- a builder that writes exactly @size@ bytes. Note that @io@ MUST write</span>
<a name="line-153"></a><span class='hs-comment'>-- EXACTLY @size@ bytes to the buffer!</span>
<a name="line-154"></a><span class='hs-comment'>{-# INLINE exactWrite #-}</span>
<a name="line-155"></a><span class='hs-definition'>exactWrite</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-156"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-157"></a>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span>
<a name="line-158"></a><span class='hs-definition'>exactWrite</span> <span class='hs-varid'>size</span> <span class='hs-varid'>io</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Write</span> <span class='hs-varid'>size</span> <span class='hs-layout'>(</span><span class='hs-varid'>pokeN</span> <span class='hs-varid'>size</span> <span class='hs-varid'>io</span><span class='hs-layout'>)</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="boundedWrite"></a><span class='hs-comment'>-- | @boundedWrite size write@ creates a bounded write from a @write@ that does</span>
<a name="line-161"></a><span class='hs-comment'>-- not write more than @size@ bytes.</span>
<a name="line-162"></a><span class='hs-comment'>{-# INLINE boundedWrite #-}</span>
<a name="line-163"></a><span class='hs-definition'>boundedWrite</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Poke</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span>
<a name="line-164"></a><span class='hs-definition'>boundedWrite</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Write</span>
<a name="line-165"></a>
<a name="line-166"></a><a name="writeLiftIO"></a><span class='hs-comment'>-- | @writeLiftIO io write@ creates a write executes the @io@ action to compute</span>
<a name="line-167"></a><span class='hs-comment'>-- the value that is then written.</span>
<a name="line-168"></a><span class='hs-comment'>{-# INLINE writeLiftIO #-}</span>
<a name="line-169"></a><span class='hs-definition'>writeLiftIO</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span>
<a name="line-170"></a><span class='hs-definition'>writeLiftIO</span> <span class='hs-varid'>write</span> <span class='hs-varid'>io</span> <span class='hs-keyglyph'>=</span>
<a name="line-171"></a>    <span class='hs-conid'>Write</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBound'</span> <span class='hs-str'>"writeLiftIO"</span> <span class='hs-varid'>write</span><span class='hs-layout'>)</span>
<a name="line-172"></a>          <span class='hs-layout'>(</span><span class='hs-conid'>Poke</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>pf</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>io</span><span class='hs-layout'>;</span> <span class='hs-varid'>runWrite</span> <span class='hs-layout'>(</span><span class='hs-varid'>write</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>pf</span><span class='hs-layout'>)</span>
<a name="line-173"></a>
<a name="line-174"></a><a name="writeIf"></a><span class='hs-comment'>-- | @writeIf p wTrue wFalse x@ creates a 'Write' with a 'Poke' equal to @wTrue</span>
<a name="line-175"></a><span class='hs-comment'>-- x@, if @p x@ and equal to @wFalse x@ otherwise. The bound of this new</span>
<a name="line-176"></a><span class='hs-comment'>-- 'Write' is the maximum of the bounds for either 'Write'. This yields a data</span>
<a name="line-177"></a><span class='hs-comment'>-- independent bound, if the bound for @wTrue@ and @wFalse@ is already data</span>
<a name="line-178"></a><span class='hs-comment'>-- independent.</span>
<a name="line-179"></a><span class='hs-comment'>{-# INLINE writeIf #-}</span>
<a name="line-180"></a><span class='hs-definition'>writeIf</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-181"></a><span class='hs-definition'>writeIf</span> <span class='hs-varid'>p</span> <span class='hs-varid'>wTrue</span> <span class='hs-varid'>wFalse</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-182"></a>    <span class='hs-varid'>boundedWrite</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBound</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wTrue</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBound</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wFalse</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-183"></a>                 <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>p</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>getPoke</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wTrue</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>getPoke</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wFalse</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-184"></a>
<a name="line-185"></a><a name="writeEq"></a><span class='hs-comment'>-- | Compare the value to a test value and use the first write action for the</span>
<a name="line-186"></a><span class='hs-comment'>-- equal case and the second write action for the non-equal case.</span>
<a name="line-187"></a><span class='hs-comment'>{-# INLINE writeEq #-}</span>
<a name="line-188"></a><span class='hs-definition'>writeEq</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Eq</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-189"></a><span class='hs-definition'>writeEq</span> <span class='hs-varid'>test</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeIf</span> <span class='hs-layout'>(</span><span class='hs-varid'>test</span> <span class='hs-varop'>==</span><span class='hs-layout'>)</span>
<a name="line-190"></a>
<a name="line-191"></a><a name="writeOrdering"></a><span class='hs-comment'>-- | TODO: Test this. It might well be too difficult to use.</span>
<a name="line-192"></a><span class='hs-comment'>--   FIXME: Better name required!</span>
<a name="line-193"></a><span class='hs-comment'>{-# INLINE writeOrdering #-}</span>
<a name="line-194"></a><span class='hs-definition'>writeOrdering</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span>
<a name="line-195"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-196"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-197"></a><span class='hs-definition'>writeOrdering</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>wLT</span> <span class='hs-varid'>wEQ</span> <span class='hs-varid'>wGT</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-198"></a>    <span class='hs-varid'>boundedWrite</span> <span class='hs-varid'>bound</span> <span class='hs-layout'>(</span><span class='hs-keyword'>case</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>x</span> <span class='hs-keyword'>of</span> <span class='hs-conid'>LT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>getPoke</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wLT</span> <span class='hs-varid'>x</span><span class='hs-layout'>;</span>
<a name="line-199"></a>                                      <span class='hs-conid'>EQ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>getPoke</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wEQ</span> <span class='hs-varid'>x</span><span class='hs-layout'>;</span>
<a name="line-200"></a>                                      <span class='hs-conid'>GT</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>getPoke</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wGT</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-201"></a>  <span class='hs-keyword'>where</span>
<a name="line-202"></a>    <span class='hs-varid'>bound</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>max</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBound</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wLT</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBound</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wEQ</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>getBound</span> <span class='hs-varop'>$</span> <span class='hs-varid'>wGT</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-203"></a>
<a name="line-204"></a><a name="writeOrd"></a><span class='hs-comment'>-- | A write combinator useful to build decision trees for deciding what value</span>
<a name="line-205"></a><span class='hs-comment'>-- to write with a constant bound on the maximal number of bytes written.</span>
<a name="line-206"></a><span class='hs-comment'>{-# INLINE writeOrd #-}</span>
<a name="line-207"></a><span class='hs-definition'>writeOrd</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ord</span> <span class='hs-varid'>a</span>
<a name="line-208"></a>       <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span>
<a name="line-209"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-210"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-211"></a><span class='hs-definition'>writeOrd</span> <span class='hs-varid'>test</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>writeOrdering</span> <span class='hs-layout'>(</span><span class='hs-varop'>`compare`</span> <span class='hs-varid'>test</span><span class='hs-layout'>)</span>
<a name="line-212"></a>
<a name="line-213"></a><a name="fromWrite"></a><span class='hs-comment'>-- | Create a builder that execute a single 'Write'.</span>
<a name="line-214"></a><span class='hs-comment'>{-# INLINE fromWrite #-}</span>
<a name="line-215"></a><span class='hs-definition'>fromWrite</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Write</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-216"></a><span class='hs-definition'>fromWrite</span> <span class='hs-layout'>(</span><span class='hs-conid'>Write</span> <span class='hs-varid'>maxSize</span> <span class='hs-varid'>wio</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-217"></a>    <span class='hs-varid'>builder</span> <span class='hs-varid'>step</span>
<a name="line-218"></a>  <span class='hs-keyword'>where</span>
<a name="line-219"></a>    <span class='hs-varid'>step</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>BufferRange</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ope</span><span class='hs-layout'>)</span>
<a name="line-220"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>op</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>maxSize</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>ope</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-221"></a>          <span class='hs-varid'>op'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runPoke</span> <span class='hs-varid'>wio</span> <span class='hs-varid'>op</span>
<a name="line-222"></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'>BufferRange</span> <span class='hs-varid'>op'</span> <span class='hs-varid'>ope</span>
<a name="line-223"></a>          <span class='hs-varid'>k</span> <span class='hs-varid'>br'</span>
<a name="line-224"></a>      <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>bufferFull</span> <span class='hs-varid'>maxSize</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-varid'>step</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-225"></a>
<a name="line-226"></a><a name="fromWriteSingleton"></a><span class='hs-comment'>{-# INLINE fromWriteSingleton #-}</span>
<a name="line-227"></a><span class='hs-definition'>fromWriteSingleton</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span><span class='hs-layout'>)</span>
<a name="line-228"></a><span class='hs-definition'>fromWriteSingleton</span> <span class='hs-varid'>write</span> <span class='hs-keyglyph'>=</span>
<a name="line-229"></a>    <span class='hs-varid'>mkBuilder</span>
<a name="line-230"></a>  <span class='hs-keyword'>where</span>
<a name="line-231"></a>    <span class='hs-varid'>mkBuilder</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>builder</span> <span class='hs-varid'>step</span>
<a name="line-232"></a>      <span class='hs-keyword'>where</span>
<a name="line-233"></a>        <span class='hs-varid'>step</span> <span class='hs-varid'>k</span> <span class='hs-layout'>(</span><span class='hs-conid'>BufferRange</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ope</span><span class='hs-layout'>)</span>
<a name="line-234"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>op</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>maxSize</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>ope</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-235"></a>              <span class='hs-varid'>op'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runPoke</span> <span class='hs-varid'>wio</span> <span class='hs-varid'>op</span>
<a name="line-236"></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'>BufferRange</span> <span class='hs-varid'>op'</span> <span class='hs-varid'>ope</span>
<a name="line-237"></a>              <span class='hs-varid'>k</span> <span class='hs-varid'>br'</span>
<a name="line-238"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>bufferFull</span> <span class='hs-varid'>maxSize</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-varid'>step</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-239"></a>          <span class='hs-keyword'>where</span>
<a name="line-240"></a>            <span class='hs-conid'>Write</span> <span class='hs-varid'>maxSize</span> <span class='hs-varid'>wio</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>write</span> <span class='hs-varid'>x</span>
<a name="line-241"></a>
<a name="line-242"></a>
<a name="line-243"></a><a name="fromWriteList"></a><span class='hs-comment'>-- | Construct a 'Builder' writing a list of data one element at a time.</span>
<a name="line-244"></a><span class='hs-definition'>fromWriteList</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-245"></a><span class='hs-definition'>fromWriteList</span> <span class='hs-varid'>write</span> <span class='hs-keyglyph'>=</span>
<a name="line-246"></a>    <span class='hs-varid'>makeBuilder</span>
<a name="line-247"></a>  <span class='hs-keyword'>where</span>
<a name="line-248"></a>    <span class='hs-varid'>makeBuilder</span> <span class='hs-varid'>xs0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>builder</span> <span class='hs-varop'>$</span> <span class='hs-varid'>step</span> <span class='hs-varid'>xs0</span>
<a name="line-249"></a>      <span class='hs-keyword'>where</span>
<a name="line-250"></a>        <span class='hs-varid'>step</span> <span class='hs-varid'>xs1</span> <span class='hs-varid'>k</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>BufferRange</span> <span class='hs-varid'>op0</span> <span class='hs-varid'>ope0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-varid'>xs1</span> <span class='hs-varid'>op0</span>
<a name="line-251"></a>          <span class='hs-keyword'>where</span>
<a name="line-252"></a>            <span class='hs-varid'>go</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>!</span><span class='hs-varid'>op</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-253"></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'>BufferRange</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ope0</span>
<a name="line-254"></a>               <span class='hs-varid'>k</span> <span class='hs-varid'>br'</span>
<a name="line-255"></a>
<a name="line-256"></a>            <span class='hs-varid'>go</span> <span class='hs-varid'>xs</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-varid'>x'</span><span class='hs-conop'>:</span><span class='hs-varid'>xs'</span><span class='hs-layout'>)</span> <span class='hs-varop'>!</span><span class='hs-varid'>op</span>
<a name="line-257"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-varid'>op</span> <span class='hs-varop'>`plusPtr`</span> <span class='hs-varid'>maxSize</span> <span class='hs-varop'>&lt;=</span> <span class='hs-varid'>ope0</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-258"></a>                  <span class='hs-varop'>!</span><span class='hs-varid'>op'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runPoke</span> <span class='hs-varid'>wio</span> <span class='hs-varid'>op</span>
<a name="line-259"></a>                  <span class='hs-varid'>go</span> <span class='hs-varid'>xs'</span> <span class='hs-varid'>op'</span>
<a name="line-260"></a>              <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-varid'>bufferFull</span> <span class='hs-varid'>maxSize</span> <span class='hs-varid'>op</span> <span class='hs-layout'>(</span><span class='hs-varid'>step</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-261"></a>              <span class='hs-keyword'>where</span>
<a name="line-262"></a>                <span class='hs-conid'>Write</span> <span class='hs-varid'>maxSize</span> <span class='hs-varid'>wio</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>write</span> <span class='hs-varid'>x'</span>
<a name="line-263"></a><span class='hs-comment'>{-# INLINE fromWriteList #-}</span>
<a name="line-264"></a>
<a name="line-265"></a>
<a name="line-266"></a>
<a name="line-267"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-268"></a><span class='hs-comment'>-- Writing storables</span>
<a name="line-269"></a><span class='hs-comment'>------------------------------------------------------------------------------</span>
<a name="line-270"></a>
<a name="line-271"></a>
<a name="line-272"></a><a name="writeStorable"></a><span class='hs-comment'>-- | Write a storable value.</span>
<a name="line-273"></a><span class='hs-comment'>{-# INLINE writeStorable #-}</span>
<a name="line-274"></a><span class='hs-definition'>writeStorable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Storable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Write</span>
<a name="line-275"></a><span class='hs-definition'>writeStorable</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exactWrite</span> <span class='hs-layout'>(</span><span class='hs-varid'>sizeOf</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>op</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>poke</span> <span class='hs-layout'>(</span><span class='hs-varid'>castPtr</span> <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-276"></a>
<a name="line-277"></a><a name="fromStorable"></a><span class='hs-comment'>-- | A builder that serializes a storable value. No alignment is done.</span>
<a name="line-278"></a><span class='hs-comment'>{-# INLINE fromStorable #-}</span>
<a name="line-279"></a><span class='hs-definition'>fromStorable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Storable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-280"></a><span class='hs-definition'>fromStorable</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromWriteSingleton</span> <span class='hs-varid'>writeStorable</span>
<a name="line-281"></a>
<a name="line-282"></a><a name="fromStorables"></a><span class='hs-comment'>-- | A builder that serializes a list of storable values by writing them</span>
<a name="line-283"></a><span class='hs-comment'>-- consecutively. No alignment is done. Parsing information needs to be</span>
<a name="line-284"></a><span class='hs-comment'>-- provided externally.</span>
<a name="line-285"></a><span class='hs-definition'>fromStorables</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Storable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Builder</span>
<a name="line-286"></a><span class='hs-definition'>fromStorables</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromWriteList</span> <span class='hs-varid'>writeStorable</span>
</pre></body>
</html>