/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__) && !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'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></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'>>=</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'>>=</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'><</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'><</span> <span class='hs-num'>0xDC00</span> <span class='hs-varop'>||</span> <span class='hs-varid'>c</span> <span class='hs-varop'>></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'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></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'>-></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, \'&#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'>-></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'>.&.</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'>-></span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></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'>-></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'>-></span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-></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'>-></span> <span class='hs-conid'>Int64</span> <span class='hs-keyglyph'>-></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'>>=</span> <span class='hs-num'>0</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>b</span> <span class='hs-varop'>>=</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'>>=</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'>>=</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'>-></span> <span class='hs-conid'>Int64</span> <span class='hs-keyglyph'>-></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'>></span> <span class='hs-num'>0</span> <span class='hs-varop'>&&</span> <span class='hs-varid'>bhi</span> <span class='hs-varop'>></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'>></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'><</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'>.&.</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'>.&.</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'>-></span> <span class='hs-conid'>Int32</span> <span class='hs-keyglyph'>-></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'><</span> <span class='hs-varid'>min32</span> <span class='hs-varop'>||</span> <span class='hs-varid'>ab</span> <span class='hs-varop'>></span> <span class='hs-varid'>max32</span> <span class='hs-keyglyph'>-></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'>-></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'>-- \'&#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>
|