This file is indexed.

/usr/share/doc/libghc-lambdabot-core-doc/html/src/Lambdabot-Util.html is in libghc-lambdabot-core-doc 5.1.0.1-1build5.

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
<?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>src/Lambdabot/Util.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-- Copyright (c) 2006 Don Stewart - <a href="http://www.cse.unsw.edu.au/~dons">http://www.cse.unsw.edu.au/~dons</a></span>
<a name="line-2"></a><span class='hs-comment'>-- GPL version 2 or later (see <a href="http://www.gnu.org/copyleft/gpl.html)">http://www.gnu.org/copyleft/gpl.html)</a></span>
<a name="line-3"></a>
<a name="line-4"></a><span class='hs-comment'>-- | String and other utilities</span>
<a name="line-5"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Lambdabot</span><span class='hs-varop'>.</span><span class='hs-conid'>Util</span> <span class='hs-layout'>(</span>
<a name="line-6"></a>        <span class='hs-varid'>strip</span><span class='hs-layout'>,</span>
<a name="line-7"></a>        <span class='hs-varid'>dropFromEnd</span><span class='hs-layout'>,</span>
<a name="line-8"></a>        <span class='hs-varid'>splitFirstWord</span><span class='hs-layout'>,</span>
<a name="line-9"></a>        <span class='hs-varid'>limitStr</span><span class='hs-layout'>,</span>
<a name="line-10"></a>        <span class='hs-varid'>listToStr</span><span class='hs-layout'>,</span>
<a name="line-11"></a>        <span class='hs-varid'>showClean</span><span class='hs-layout'>,</span>
<a name="line-12"></a>        <span class='hs-varid'>expandTab</span><span class='hs-layout'>,</span>
<a name="line-13"></a>        <span class='hs-varid'>arePrefixesWithSpaceOf</span><span class='hs-layout'>,</span>
<a name="line-14"></a>        <span class='hs-varid'>arePrefixesOf</span><span class='hs-layout'>,</span>
<a name="line-15"></a>
<a name="line-16"></a>        <span class='hs-varid'>io</span><span class='hs-layout'>,</span>
<a name="line-17"></a>
<a name="line-18"></a>        <span class='hs-varid'>random</span><span class='hs-layout'>,</span>
<a name="line-19"></a>        <span class='hs-varid'>randomFailureMsg</span><span class='hs-layout'>,</span>
<a name="line-20"></a>        <span class='hs-varid'>randomSuccessMsg</span>
<a name="line-21"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span><span class='hs-varop'>.</span><span class='hs-conid'>Trans</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Char</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Random</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Lambdabot</span><span class='hs-varop'>.</span><span class='hs-conid'>Config</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Lambdabot</span><span class='hs-varop'>.</span><span class='hs-conid'>Config</span><span class='hs-varop'>.</span><span class='hs-conid'>Core</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="splitFirstWord"></a><span class='hs-comment'>-- | Break a String into it's first word, and the rest of the string. Example:</span>
<a name="line-33"></a><span class='hs-comment'>--</span>
<a name="line-34"></a><span class='hs-comment'>-- &gt; split_first_word "A fine day" ===&gt; ("A", "fine day)</span>
<a name="line-35"></a><span class='hs-definition'>splitFirstWord</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ String to be broken</span>
<a name="line-36"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-definition'>splitFirstWord</span> <span class='hs-varid'>xs</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>dropWhile</span> <span class='hs-varid'>isSpace</span> <span class='hs-varid'>xs'</span><span class='hs-layout'>)</span>
<a name="line-38"></a>  <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-layout'>,</span> <span class='hs-varid'>xs'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>break</span> <span class='hs-varid'>isSpace</span> <span class='hs-varid'>xs</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="limitStr"></a><span class='hs-comment'>-- | Truncate a string to the specified length, putting ellipses at the</span>
<a name="line-41"></a><span class='hs-comment'>-- end if necessary.</span>
<a name="line-42"></a><span class='hs-definition'>limitStr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-43"></a><span class='hs-definition'>limitStr</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitAt</span> <span class='hs-varid'>n</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>in</span>
<a name="line-44"></a>           <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>t</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>b</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>take</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-comment'>-</span><span class='hs-num'>3</span><span class='hs-layout'>)</span> <span class='hs-varid'>b</span> <span class='hs-varop'>++</span> <span class='hs-str'>"..."</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="listToStr"></a><span class='hs-comment'>-- | Form a list of terms using a single conjunction. Example:</span>
<a name="line-47"></a><span class='hs-comment'>--</span>
<a name="line-48"></a><span class='hs-comment'>-- &gt; listToStr "and" ["a", "b", "c"] ===&gt; "a, b and c"</span>
<a name="line-49"></a><span class='hs-definition'>listToStr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-50"></a><span class='hs-definition'>listToStr</span> <span class='hs-keyword'>_</span>    <span class='hs-conid'>[]</span>           <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-51"></a><span class='hs-definition'>listToStr</span> <span class='hs-varid'>conj</span> <span class='hs-layout'>(</span><span class='hs-varid'>item</span><span class='hs-conop'>:</span><span class='hs-varid'>items</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-52"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>listToStr'</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-53"></a>      <span class='hs-varid'>listToStr'</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>y</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concat</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>" "</span><span class='hs-layout'>,</span> <span class='hs-varid'>conj</span><span class='hs-layout'>,</span> <span class='hs-str'>" "</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-keyglyph'>]</span>
<a name="line-54"></a>      <span class='hs-varid'>listToStr'</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-conop'>:</span><span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concat</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>", "</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>listToStr'</span> <span class='hs-varid'>ys</span><span class='hs-keyglyph'>]</span>
<a name="line-55"></a>  <span class='hs-keyword'>in</span>  <span class='hs-varid'>item</span> <span class='hs-varop'>++</span> <span class='hs-varid'>listToStr'</span> <span class='hs-varid'>items</span>
<a name="line-56"></a>
<a name="line-57"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="random"></a><span class='hs-comment'>-- | Pick a random element of the list.</span>
<a name="line-60"></a><span class='hs-definition'>random</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-61"></a><span class='hs-definition'>random</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>io</span> <span class='hs-varop'>.</span> <span class='hs-varid'>sample</span> <span class='hs-varop'>.</span> <span class='hs-varid'>randomElement</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-64"></a>
<a name="line-65"></a><a name="strip"></a><span class='hs-comment'>-- | 'strip' takes as input a predicate and a list and strips</span>
<a name="line-66"></a><span class='hs-comment'>--   elements matching the predicate from the prefix as well as</span>
<a name="line-67"></a><span class='hs-comment'>--   the suffix of the list. Example:</span>
<a name="line-68"></a><span class='hs-comment'>--</span>
<a name="line-69"></a><span class='hs-comment'>-- &gt; strip isSpace "   abc  " ===&gt; "abc"</span>
<a name="line-70"></a><span class='hs-definition'>strip</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-71"></a><span class='hs-definition'>strip</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse</span> <span class='hs-varop'>.</span> <span class='hs-varid'>dropWhile</span> <span class='hs-varid'>p</span> <span class='hs-keyword'>in</span> <span class='hs-varid'>f</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="dropFromEnd"></a><span class='hs-comment'>-- | Drop elements matching a predicate from the end of a list</span>
<a name="line-74"></a><span class='hs-definition'>dropFromEnd</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-75"></a><span class='hs-definition'>dropFromEnd</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse</span> <span class='hs-varop'>.</span> <span class='hs-varid'>dropWhile</span> <span class='hs-varid'>p</span> <span class='hs-varop'>.</span> <span class='hs-varid'>reverse</span>
<a name="line-76"></a>
<a name="line-77"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-78"></a>
<a name="line-79"></a><a name="showClean"></a><span class='hs-comment'>-- | show a list without heavyweight formatting</span>
<a name="line-80"></a><span class='hs-comment'>-- NB: assumes show instance outputs a quoted 'String'.</span>
<a name="line-81"></a><span class='hs-comment'>-- under that assumption, strips the outer quotes.</span>
<a name="line-82"></a><span class='hs-definition'>showClean</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Show</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-83"></a><span class='hs-definition'>showClean</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>intercalate</span> <span class='hs-str'>" "</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>init</span> <span class='hs-varop'>.</span> <span class='hs-varid'>tail</span> <span class='hs-varop'>.</span> <span class='hs-varid'>show</span><span class='hs-layout'>)</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="expandTab"></a><span class='hs-comment'>-- | untab an string</span>
<a name="line-86"></a><span class='hs-definition'>expandTab</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-87"></a><span class='hs-definition'>expandTab</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>go</span> <span class='hs-num'>0</span>
<a name="line-88"></a>  <span class='hs-keyword'>where</span>
<a name="line-89"></a>    <span class='hs-varid'>go</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span>         <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-90"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-chr'>'\t'</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>replicate</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span> <span class='hs-comment'>-</span> <span class='hs-varid'>i</span> <span class='hs-varop'>`mod`</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-chr'>' '</span> <span class='hs-varop'>++</span> <span class='hs-varid'>go</span> <span class='hs-num'>0</span> <span class='hs-varid'>xs</span>
<a name="line-91"></a>    <span class='hs-varid'>go</span> <span class='hs-varid'>i</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-keyglyph'>=</span> <span class='hs-varid'>x</span> <span class='hs-conop'>:</span> <span class='hs-varid'>go</span> <span class='hs-layout'>(</span><span class='hs-varid'>i</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span>
<a name="line-92"></a>
<a name="line-93"></a><span class='hs-comment'>------------------------------------------------------------------------</span>
<a name="line-94"></a>
<a name="line-95"></a><a name="io"></a><span class='hs-comment'>-- convenience:</span>
<a name="line-96"></a><span class='hs-definition'>io</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-97"></a><span class='hs-definition'>io</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIO</span>
<a name="line-98"></a><span class='hs-comment'>{-# INLINE io #-}</span>
<a name="line-99"></a>
<a name="line-100"></a><a name="arePrefixesWithSpaceOf"></a><span class='hs-definition'>arePrefixesWithSpaceOf</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-101"></a><span class='hs-definition'>arePrefixesWithSpaceOf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>arePrefixesOf</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varop'>++</span> <span class='hs-str'>" "</span><span class='hs-layout'>)</span>
<a name="line-102"></a>
<a name="line-103"></a><a name="arePrefixesOf"></a><span class='hs-definition'>arePrefixesOf</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-104"></a><span class='hs-definition'>arePrefixesOf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>flip</span> <span class='hs-layout'>(</span><span class='hs-varid'>any</span> <span class='hs-varop'>.</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>isPrefixOf</span><span class='hs-layout'>)</span>
<a name="line-105"></a>
<a name="line-106"></a><a name="insult"></a><span class='hs-comment'>--</span>
<a name="line-107"></a><span class='hs-comment'>-- Amusing insults from OpenBSD sudo</span>
<a name="line-108"></a><span class='hs-comment'>--</span>
<a name="line-109"></a><span class='hs-definition'>insult</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-110"></a><span class='hs-definition'>insult</span> <span class='hs-keyglyph'>=</span>
<a name="line-111"></a>   <span class='hs-keyglyph'>[</span><span class='hs-str'>"Just what do you think you're doing Dave?"</span><span class='hs-layout'>,</span>
<a name="line-112"></a>    <span class='hs-str'>"It can only be attributed to human error."</span><span class='hs-layout'>,</span>
<a name="line-113"></a>    <span class='hs-str'>"That's something I cannot allow to happen."</span><span class='hs-layout'>,</span>
<a name="line-114"></a>    <span class='hs-str'>"My mind is going. I can feel it."</span><span class='hs-layout'>,</span>
<a name="line-115"></a>    <span class='hs-str'>"Sorry about this, I know it's a bit silly."</span><span class='hs-layout'>,</span>
<a name="line-116"></a>    <span class='hs-str'>"Take a stress pill and think things over."</span><span class='hs-layout'>,</span>
<a name="line-117"></a>    <span class='hs-str'>"This mission is too important for me to allow you to jeopardize it."</span><span class='hs-layout'>,</span>
<a name="line-118"></a>    <span class='hs-str'>"I feel much better now."</span><span class='hs-layout'>,</span>
<a name="line-119"></a>
<a name="line-120"></a>    <span class='hs-str'>"Wrong!  You cheating scum!"</span><span class='hs-layout'>,</span>
<a name="line-121"></a>    <span class='hs-str'>"And you call yourself a Rocket Scientist!"</span><span class='hs-layout'>,</span>
<a name="line-122"></a>    <span class='hs-str'>"And you call yourself a Rocket Surgeon!"</span><span class='hs-layout'>,</span>
<a name="line-123"></a>    <span class='hs-str'>"Where did you learn to type?"</span><span class='hs-layout'>,</span>
<a name="line-124"></a>    <span class='hs-str'>"Are you on drugs?"</span><span class='hs-layout'>,</span>
<a name="line-125"></a>    <span class='hs-str'>"My pet ferret can type better than you!"</span><span class='hs-layout'>,</span>
<a name="line-126"></a>    <span class='hs-str'>"You type like i drive."</span><span class='hs-layout'>,</span>
<a name="line-127"></a>    <span class='hs-str'>"Do you think like you type?"</span><span class='hs-layout'>,</span>
<a name="line-128"></a>    <span class='hs-str'>"Your mind just hasn't been the same since the electro-shock, has it?"</span><span class='hs-layout'>,</span>
<a name="line-129"></a>    <span class='hs-str'>"I don't think I can be your friend on Facebook anymore."</span><span class='hs-layout'>,</span>
<a name="line-130"></a>
<a name="line-131"></a>    <span class='hs-str'>"Maybe if you used more than just two fingers..."</span><span class='hs-layout'>,</span>
<a name="line-132"></a>    <span class='hs-str'>"BOB says:  You seem to have forgotten your passwd, enter another!"</span><span class='hs-layout'>,</span>
<a name="line-133"></a>    <span class='hs-str'>"stty: unknown mode: doofus"</span><span class='hs-layout'>,</span>
<a name="line-134"></a>    <span class='hs-str'>"I can't hear you -- I'm using the scrambler."</span><span class='hs-layout'>,</span>
<a name="line-135"></a>    <span class='hs-str'>"The more you drive -- the dumber you get."</span><span class='hs-layout'>,</span>
<a name="line-136"></a>    <span class='hs-str'>"Listen, broccoli brains, I don't have time to listen to this trash."</span><span class='hs-layout'>,</span>
<a name="line-137"></a>    <span class='hs-str'>"I've seen penguins that can type better than that."</span><span class='hs-layout'>,</span>
<a name="line-138"></a>    <span class='hs-str'>"Have you considered trying to match wits with a rutabaga?"</span><span class='hs-layout'>,</span>
<a name="line-139"></a>    <span class='hs-str'>"You speak an infinite deal of nothing."</span><span class='hs-layout'>,</span>
<a name="line-140"></a>
<a name="line-141"></a>    <span class='hs-comment'>-- other</span>
<a name="line-142"></a>    <span class='hs-str'>"Are you typing with your feet?"</span><span class='hs-layout'>,</span>
<a name="line-143"></a>    <span class='hs-str'>"Abort, Retry, Panic?"</span><span class='hs-layout'>,</span>
<a name="line-144"></a>
<a name="line-145"></a>    <span class='hs-comment'>-- More haskellish insults</span>
<a name="line-146"></a>    <span class='hs-str'>"You untyped fool!"</span><span class='hs-layout'>,</span>
<a name="line-147"></a>    <span class='hs-str'>"My brain just exploded"</span>
<a name="line-148"></a>    <span class='hs-keyglyph'>]</span>
<a name="line-149"></a>
<a name="line-150"></a><a name="apology"></a><span class='hs-comment'>--</span>
<a name="line-151"></a><span class='hs-comment'>-- some more friendly replies</span>
<a name="line-152"></a><span class='hs-comment'>--</span>
<a name="line-153"></a><span class='hs-definition'>apology</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-154"></a><span class='hs-definition'>apology</span> <span class='hs-keyglyph'>=</span>
<a name="line-155"></a>   <span class='hs-keyglyph'>[</span><span class='hs-str'>"I am sorry."</span><span class='hs-layout'>,</span><span class='hs-str'>"Sorry."</span><span class='hs-layout'>,</span>
<a name="line-156"></a>    <span class='hs-str'>"Maybe you made a typo?"</span><span class='hs-layout'>,</span>
<a name="line-157"></a>    <span class='hs-str'>"Just try something else."</span><span class='hs-layout'>,</span>
<a name="line-158"></a>    <span class='hs-str'>"There are some things that I just don't know."</span><span class='hs-layout'>,</span>
<a name="line-159"></a>    <span class='hs-str'>"Whoa."</span><span class='hs-layout'>,</span>
<a name="line-160"></a>    <span class='hs-str'>":("</span><span class='hs-layout'>,</span><span class='hs-str'>":("</span><span class='hs-layout'>,</span>
<a name="line-161"></a>    <span class='hs-str'>""</span><span class='hs-layout'>,</span><span class='hs-str'>""</span><span class='hs-layout'>,</span><span class='hs-str'>""</span>
<a name="line-162"></a>    <span class='hs-keyglyph'>]</span>
<a name="line-163"></a>
<a name="line-164"></a><a name="randomFailureMsg"></a><span class='hs-definition'>randomFailureMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadConfig</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>String</span>
<a name="line-165"></a><span class='hs-definition'>randomFailureMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-166"></a>    <span class='hs-varid'>useInsults</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getConfig</span> <span class='hs-varid'>enableInsults</span>
<a name="line-167"></a>    <span class='hs-varid'>random</span> <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>useInsults</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>insult</span> <span class='hs-varop'>++</span> <span class='hs-varid'>apology</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>apology</span><span class='hs-layout'>)</span>
<a name="line-168"></a>
<a name="line-169"></a><a name="confirmation"></a><span class='hs-comment'>--</span>
<a name="line-170"></a><span class='hs-comment'>-- Some more interesting confirmations for @remember and @where</span>
<a name="line-171"></a><span class='hs-comment'>--</span>
<a name="line-172"></a><span class='hs-definition'>confirmation</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-173"></a><span class='hs-definition'>confirmation</span> <span class='hs-keyglyph'>=</span>
<a name="line-174"></a>   <span class='hs-keyglyph'>[</span><span class='hs-str'>"Done."</span><span class='hs-layout'>,</span><span class='hs-str'>"Done."</span><span class='hs-layout'>,</span>
<a name="line-175"></a>    <span class='hs-str'>"Okay."</span><span class='hs-layout'>,</span>
<a name="line-176"></a>    <span class='hs-str'>"I will remember."</span><span class='hs-layout'>,</span>
<a name="line-177"></a>    <span class='hs-str'>"Good to know."</span><span class='hs-layout'>,</span>
<a name="line-178"></a>    <span class='hs-str'>"It is stored."</span><span class='hs-layout'>,</span>
<a name="line-179"></a>    <span class='hs-str'>"I will never forget."</span><span class='hs-layout'>,</span>
<a name="line-180"></a>    <span class='hs-str'>"It is forever etched in my memory."</span><span class='hs-layout'>,</span>
<a name="line-181"></a>    <span class='hs-str'>"Nice!"</span>
<a name="line-182"></a>   <span class='hs-keyglyph'>]</span>
<a name="line-183"></a>
<a name="line-184"></a><a name="randomSuccessMsg"></a><span class='hs-definition'>randomSuccessMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>String</span>
<a name="line-185"></a><span class='hs-definition'>randomSuccessMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>random</span> <span class='hs-varid'>confirmation</span>
</pre></body>
</html>