/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 <leon@melding-monads.com></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'>-></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 -> 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'>-></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'>-></span> <span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-115"></a> <span class='hs-keyglyph'>-></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'>>=></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'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-varid'>io</span> <span class='hs-varid'>op</span> <span class='hs-varop'>>></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'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>Ptr</span> <span class='hs-conid'>Word8</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-conid'>Poke</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-keyword'>do</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'><-</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'>-></span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Ordering</span><span class='hs-layout'>)</span>
<a name="line-195"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-196"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></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'>-></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'>-></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'>=></span> <span class='hs-varid'>a</span>
<a name="line-209"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span>
<a name="line-210"></a> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></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'><=</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'><-</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'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'><=</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'><-</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'>-></span> <span class='hs-conid'>Write</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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'><=</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'><-</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'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>-></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'>=></span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></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'>=></span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-></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>
|