This file is indexed.

/usr/share/doc/libghc-text-doc/html/src/Data-Text-Internal.html is in libghc-text-doc 1.2.2.1-3.

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
<?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>Data/Text/Internal.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, DeriveDataTypeable, UnboxedTuples #-}</span>
<a name="line-2"></a><span class='hs-comment'>{-# OPTIONS_HADDOCK not-home #-}</span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-comment'>-- |</span>
<a name="line-5"></a><span class='hs-comment'>-- Module      : Data.Text.Internal</span>
<a name="line-6"></a><span class='hs-comment'>-- Copyright   : (c) 2008, 2009 Tom Harper,</span>
<a name="line-7"></a><span class='hs-comment'>--               (c) 2009, 2010 Bryan O'Sullivan,</span>
<a name="line-8"></a><span class='hs-comment'>--               (c) 2009 Duncan Coutts</span>
<a name="line-9"></a><span class='hs-comment'>--</span>
<a name="line-10"></a><span class='hs-comment'>-- License     : BSD-style</span>
<a name="line-11"></a><span class='hs-comment'>-- Maintainer  : bos@serpentine.com</span>
<a name="line-12"></a><span class='hs-comment'>-- Stability   : experimental</span>
<a name="line-13"></a><span class='hs-comment'>-- Portability : GHC</span>
<a name="line-14"></a><span class='hs-comment'>--</span>
<a name="line-15"></a><span class='hs-comment'>-- A module containing private 'Text' internals. This exposes the</span>
<a name="line-16"></a><span class='hs-comment'>-- 'Text' representation and low level construction functions.</span>
<a name="line-17"></a><span class='hs-comment'>-- Modules which extend the 'Text' system may need to use this module.</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- You should not use this module unless you are determined to monkey</span>
<a name="line-20"></a><span class='hs-comment'>-- with the internals, as the functions here do just about nothing to</span>
<a name="line-21"></a><span class='hs-comment'>-- preserve data invariants.  You have been warned!</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-cpp'>#if defined(__GLASGOW_HASKELL__) &amp;&amp; !defined(__HADDOCK__)</span>
<a name="line-24"></a><span class='hs-cpp'>#include "MachDeps.h"</span>
<a name="line-25"></a><span class='hs-cpp'>#endif</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span>
<a name="line-28"></a>    <span class='hs-layout'>(</span>
<a name="line-29"></a>    <span class='hs-comment'>-- * Types</span>
<a name="line-30"></a>    <span class='hs-comment'>-- $internals</span>
<a name="line-31"></a>      <span class='hs-conid'>Text</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span>
<a name="line-32"></a>    <span class='hs-comment'>-- * Construction</span>
<a name="line-33"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>text</span>
<a name="line-34"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>textP</span>
<a name="line-35"></a>    <span class='hs-comment'>-- * Safety</span>
<a name="line-36"></a>    <span class='hs-layout'>,</span> <span class='hs-keyword'>safe</span>
<a name="line-37"></a>    <span class='hs-comment'>-- * Code that must be here for accessibility</span>
<a name="line-38"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>empty</span>
<a name="line-39"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>empty_</span>
<a name="line-40"></a>    <span class='hs-comment'>-- * Utilities</span>
<a name="line-41"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>firstf</span>
<a name="line-42"></a>    <span class='hs-comment'>-- * Checked multiplication</span>
<a name="line-43"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mul</span>
<a name="line-44"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mul32</span>
<a name="line-45"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mul64</span>
<a name="line-46"></a>    <span class='hs-comment'>-- * Debugging</span>
<a name="line-47"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>showText</span>
<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-cpp'>#if defined(ASSERTS)</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-layout'>(</span><span class='hs-varid'>assert</span><span class='hs-layout'>)</span>
<a name="line-52"></a><span class='hs-cpp'>#endif</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Bits</span>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Int</span> <span class='hs-layout'>(</span><span class='hs-conid'>Int32</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int64</span><span class='hs-layout'>)</span>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Internal</span><span class='hs-varop'>.</span><span class='hs-conid'>Unsafe</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span> <span class='hs-layout'>(</span><span class='hs-varid'>ord</span><span class='hs-layout'>)</span>
<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'>Typeable</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>A</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="Text"></a><span class='hs-comment'>-- | A space efficient, packed, unboxed Unicode text type.</span>
<a name="line-60"></a><a name="Text"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span>
<a name="line-61"></a>    <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span>          <span class='hs-comment'>-- payload (Word16 elements)</span>
<a name="line-62"></a>    <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>              <span class='hs-comment'>-- offset (units of Word16, not Char)</span>
<a name="line-63"></a>    <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span>              <span class='hs-comment'>-- length (units of Word16, not Char)</span>
<a name="line-64"></a>    <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Typeable</span><span class='hs-layout'>)</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="text_"></a><span class='hs-comment'>-- | Smart constructor.</span>
<a name="line-67"></a><span class='hs-definition'>text_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Text</span>
<a name="line-68"></a><span class='hs-definition'>text_</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span> <span class='hs-keyglyph'>=</span>
<a name="line-69"></a><span class='hs-cpp'>#if defined(ASSERTS)</span>
<a name="line-70"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>c</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>unsafeIndex</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span>
<a name="line-71"></a>      <span class='hs-varid'>alen</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>length</span> <span class='hs-varid'>arr</span>
<a name="line-72"></a>  <span class='hs-keyword'>in</span> <span class='hs-varid'>assert</span> <span class='hs-layout'>(</span><span class='hs-varid'>len</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-73"></a>     <span class='hs-varid'>assert</span> <span class='hs-layout'>(</span><span class='hs-varid'>off</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-74"></a>     <span class='hs-varid'>assert</span> <span class='hs-layout'>(</span><span class='hs-varid'>alen</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-varop'>||</span> <span class='hs-varid'>len</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-varop'>||</span> <span class='hs-varid'>off</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>alen</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span>
<a name="line-75"></a>     <span class='hs-varid'>assert</span> <span class='hs-layout'>(</span><span class='hs-varid'>len</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0xDC00</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0xDFFF</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-76"></a><span class='hs-cpp'>#endif</span>
<a name="line-77"></a>     <span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span>
<a name="line-78"></a><span class='hs-comment'>{-# INLINE text_ #-}</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="empty"></a><span class='hs-comment'>-- | /O(1)/ The empty 'Text'.</span>
<a name="line-81"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Text</span>
<a name="line-82"></a><span class='hs-definition'>empty</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span>
<a name="line-83"></a><span class='hs-comment'>{-# INLINE [1] empty #-}</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="empty_"></a><span class='hs-comment'>-- | A non-inlined version of 'empty'.</span>
<a name="line-86"></a><span class='hs-definition'>empty_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Text</span>
<a name="line-87"></a><span class='hs-definition'>empty_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Text</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span> <span class='hs-num'>0</span> <span class='hs-num'>0</span>
<a name="line-88"></a><span class='hs-comment'>{-# NOINLINE empty_ #-}</span>
<a name="line-89"></a>
<a name="line-90"></a><a name="text"></a><span class='hs-comment'>-- | Construct a 'Text' without invisibly pinning its byte array in</span>
<a name="line-91"></a><span class='hs-comment'>-- memory if its length has dwindled to zero.</span>
<a name="line-92"></a><span class='hs-definition'>text</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Text</span>
<a name="line-93"></a><span class='hs-definition'>text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>len</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>empty</span>
<a name="line-94"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text_</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span>
<a name="line-95"></a><span class='hs-comment'>{-# INLINE text #-}</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="textP"></a><span class='hs-definition'>textP</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Text</span>
<a name="line-98"></a><span class='hs-comment'>{-# DEPRECATED textP "Use text instead" #-}</span>
<a name="line-99"></a><span class='hs-definition'>textP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span>
<a name="line-100"></a>
<a name="line-101"></a><a name="showText"></a><span class='hs-comment'>-- | A useful 'show'-like function for debugging purposes.</span>
<a name="line-102"></a><span class='hs-definition'>showText</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Text</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-103"></a><span class='hs-definition'>showText</span> <span class='hs-layout'>(</span><span class='hs-conid'>Text</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-104"></a>    <span class='hs-str'>"Text "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>A</span><span class='hs-varop'>.</span><span class='hs-varid'>toList</span> <span class='hs-varid'>arr</span> <span class='hs-varid'>off</span> <span class='hs-varid'>len</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-chr'>' '</span> <span class='hs-conop'>:</span>
<a name="line-105"></a>            <span class='hs-varid'>show</span> <span class='hs-varid'>off</span> <span class='hs-varop'>++</span> <span class='hs-chr'>' '</span> <span class='hs-conop'>:</span> <span class='hs-varid'>show</span> <span class='hs-varid'>len</span>
<a name="line-106"></a>
<a name="line-107"></a><span class='hs-comment'>-- | Map a 'Char' to a 'Text'-safe value.</span>
<a name="line-108"></a><span class='hs-comment'>--</span>
<a name="line-109"></a><span class='hs-comment'>-- UTF-16 surrogate code points are not included in the set of Unicode</span>
<a name="line-110"></a><span class='hs-comment'>-- scalar values, but are unfortunately admitted as valid 'Char'</span>
<a name="line-111"></a><span class='hs-comment'>-- values by Haskell.  They cannot be represented in a 'Text'.  This</span>
<a name="line-112"></a><span class='hs-comment'>-- function remaps those code points to the Unicode replacement</span>
<a name="line-113"></a><span class='hs-comment'>-- character (U+FFFD, \'&amp;#xfffd;\'), and leaves other code points</span>
<a name="line-114"></a><span class='hs-comment'>-- unchanged.</span>
<a name="line-115"></a><span class='hs-keyword'>safe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Char</span>
<a name="line-116"></a><span class='hs-keyword'>safe</span> <span class='hs-varid'>c</span>
<a name="line-117"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ord</span> <span class='hs-varid'>c</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-num'>0x1ff800</span> <span class='hs-varop'>/=</span> <span class='hs-num'>0xd800</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>c</span>
<a name="line-118"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-chr'>'\xfffd'</span>
<a name="line-119"></a><span class='hs-comment'>{-# INLINE [0] safe #-}</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="firstf"></a><span class='hs-comment'>-- | Apply a function to the first element of an optional pair.</span>
<a name="line-122"></a><span class='hs-definition'>firstf</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-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>c</span><span class='hs-layout'>,</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-123"></a><span class='hs-definition'>firstf</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-124"></a><span class='hs-definition'>firstf</span> <span class='hs-keyword'>_</span>  <span class='hs-conid'>Nothing</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="mul"></a><span class='hs-comment'>-- | Checked multiplication.  Calls 'error' if the result would</span>
<a name="line-127"></a><span class='hs-comment'>-- overflow.</span>
<a name="line-128"></a><span class='hs-definition'>mul</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span>
<a name="line-129"></a><span class='hs-cpp'>#if WORD_SIZE_IN_BITS == 64</span>
<a name="line-130"></a><span class='hs-definition'>mul</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`mul64`</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>b</span>
<a name="line-131"></a><span class='hs-cpp'>#else</span>
<a name="line-132"></a><span class='hs-definition'>mul</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`mul32`</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>b</span>
<a name="line-133"></a><span class='hs-cpp'>#endif</span>
<a name="line-134"></a><span class='hs-comment'>{-# INLINE mul #-}</span>
<a name="line-135"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>7</span> <span class='hs-varop'>`mul`</span>
<a name="line-136"></a>
<a name="line-137"></a><a name="mul64"></a><span class='hs-comment'>-- | Checked multiplication.  Calls 'error' if the result would</span>
<a name="line-138"></a><span class='hs-comment'>-- overflow.</span>
<a name="line-139"></a><span class='hs-definition'>mul64</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int64</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int64</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int64</span>
<a name="line-140"></a><span class='hs-definition'>mul64</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span>
<a name="line-141"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>b</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span>  <span class='hs-varid'>mul64_</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span>
<a name="line-142"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>a</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span>           <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-varid'>mul64_</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-143"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>b</span> <span class='hs-varop'>&gt;=</span> <span class='hs-num'>0</span>           <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-varid'>mul64_</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>b</span>
<a name="line-144"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>        <span class='hs-keyglyph'>=</span>  <span class='hs-varid'>mul64_</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-145"></a><span class='hs-comment'>{-# INLINE mul64 #-}</span>
<a name="line-146"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>7</span> <span class='hs-varop'>`mul64`</span>
<a name="line-147"></a>
<a name="line-148"></a><a name="mul64_"></a><span class='hs-definition'>mul64_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int64</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int64</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int64</span>
<a name="line-149"></a><span class='hs-definition'>mul64_</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span>
<a name="line-150"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ahi</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>bhi</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"overflow"</span>
<a name="line-151"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>top</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>0x7fffffff</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"overflow"</span>
<a name="line-152"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>total</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"overflow"</span>
<a name="line-153"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>total</span>
<a name="line-154"></a>  <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-cpp'>#</span> <span class='hs-varid'>ahi</span><span class='hs-layout'>,</span> <span class='hs-varid'>alo</span> <span class='hs-cpp'>#</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-cpp'>#</span> <span class='hs-varid'>a</span> <span class='hs-varop'>`shiftR`</span> <span class='hs-num'>32</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-num'>0xffffffff</span> <span class='hs-cpp'>#</span><span class='hs-layout'>)</span>
<a name="line-155"></a>        <span class='hs-layout'>(</span><span class='hs-cpp'>#</span> <span class='hs-varid'>bhi</span><span class='hs-layout'>,</span> <span class='hs-varid'>blo</span> <span class='hs-cpp'>#</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-cpp'>#</span> <span class='hs-varid'>b</span> <span class='hs-varop'>`shiftR`</span> <span class='hs-num'>32</span><span class='hs-layout'>,</span> <span class='hs-varid'>b</span> <span class='hs-varop'>.&amp;.</span> <span class='hs-num'>0xffffffff</span> <span class='hs-cpp'>#</span><span class='hs-layout'>)</span>
<a name="line-156"></a>        <span class='hs-varid'>top</span>            <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ahi</span> <span class='hs-varop'>*</span> <span class='hs-varid'>blo</span> <span class='hs-varop'>+</span> <span class='hs-varid'>alo</span> <span class='hs-varop'>*</span> <span class='hs-varid'>bhi</span>
<a name="line-157"></a>        <span class='hs-varid'>total</span>          <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>top</span> <span class='hs-varop'>`shiftL`</span> <span class='hs-num'>32</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-varid'>alo</span> <span class='hs-varop'>*</span> <span class='hs-varid'>blo</span>
<a name="line-158"></a><span class='hs-comment'>{-# INLINE mul64_ #-}</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="mul32"></a><span class='hs-comment'>-- | Checked multiplication.  Calls 'error' if the result would</span>
<a name="line-161"></a><span class='hs-comment'>-- overflow.</span>
<a name="line-162"></a><span class='hs-definition'>mul32</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int32</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int32</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int32</span>
<a name="line-163"></a><span class='hs-definition'>mul32</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>a</span> <span class='hs-varop'>*</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>of</span>
<a name="line-164"></a>              <span class='hs-varid'>ab</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>ab</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>min32</span> <span class='hs-varop'>||</span> <span class='hs-varid'>ab</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>max32</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>error</span> <span class='hs-str'>"overflow"</span>
<a name="line-165"></a>                 <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fromIntegral</span> <span class='hs-varid'>ab</span>
<a name="line-166"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>min32</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-num'>0x80000000</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int64</span>
<a name="line-167"></a>        <span class='hs-varid'>max32</span> <span class='hs-keyglyph'>=</span>  <span class='hs-num'>0x7fffffff</span>
<a name="line-168"></a><span class='hs-comment'>{-# INLINE mul32 #-}</span>
<a name="line-169"></a><span class='hs-keyword'>infixl</span> <span class='hs-num'>7</span> <span class='hs-varop'>`mul32`</span>
<a name="line-170"></a>
<a name="line-171"></a><span class='hs-comment'>-- $internals</span>
<a name="line-172"></a><span class='hs-comment'>--</span>
<a name="line-173"></a><span class='hs-comment'>-- Internally, the 'Text' type is represented as an array of 'Word16'</span>
<a name="line-174"></a><span class='hs-comment'>-- UTF-16 code units. The offset and length fields in the constructor</span>
<a name="line-175"></a><span class='hs-comment'>-- are in these units, /not/ units of 'Char'.</span>
<a name="line-176"></a><span class='hs-comment'>--</span>
<a name="line-177"></a><span class='hs-comment'>-- Invariants that all functions must maintain:</span>
<a name="line-178"></a><span class='hs-comment'>--</span>
<a name="line-179"></a><span class='hs-comment'>-- * Since the 'Text' type uses UTF-16 internally, it cannot represent</span>
<a name="line-180"></a><span class='hs-comment'>--   characters in the reserved surrogate code point range U+D800 to</span>
<a name="line-181"></a><span class='hs-comment'>--   U+DFFF. To maintain this invariant, the 'safe' function maps</span>
<a name="line-182"></a><span class='hs-comment'>--   'Char' values in this range to the replacement character (U+FFFD,</span>
<a name="line-183"></a><span class='hs-comment'>--   \'&amp;#xfffd;\').</span>
<a name="line-184"></a><span class='hs-comment'>--</span>
<a name="line-185"></a><span class='hs-comment'>-- * A leading (or \"high\") surrogate code unit (0xD800–0xDBFF) must</span>
<a name="line-186"></a><span class='hs-comment'>--   always be followed by a trailing (or \"low\") surrogate code unit</span>
<a name="line-187"></a><span class='hs-comment'>--   (0xDC00-0xDFFF). A trailing surrogate code unit must always be</span>
<a name="line-188"></a><span class='hs-comment'>--   preceded by a leading surrogate code unit.</span>
</pre></body>
</html>