This file is indexed.

/usr/share/doc/libghc-cabal-doc/html/src/Distribution-GetOpt.html is in libghc-cabal-doc 1.24.1.0-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
<?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>Distribution/GetOpt.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-2"></a><span class='hs-comment'>-- |</span>
<a name="line-3"></a><span class='hs-comment'>-- Module      :  Distribution.GetOpt</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   :  (c) Sven Panne 2002-2005</span>
<a name="line-5"></a><span class='hs-comment'>-- License     :  BSD-style (see the file libraries/base/LICENSE)</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- Maintainer  :  libraries@haskell.org</span>
<a name="line-8"></a><span class='hs-comment'>-- Portability :  portable</span>
<a name="line-9"></a><span class='hs-comment'>--</span>
<a name="line-10"></a><span class='hs-comment'>-- This library provides facilities for parsing the command-line options</span>
<a name="line-11"></a><span class='hs-comment'>-- in a standalone program.  It is essentially a Haskell port of the GNU</span>
<a name="line-12"></a><span class='hs-comment'>-- @getopt@ library.</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
<a name="line-15"></a>
<a name="line-16"></a><span class='hs-comment'>{-
<a name="line-17"></a>Sven Panne &lt;Sven.Panne@informatik.uni-muenchen.de&gt; Oct. 1996 (small
<a name="line-18"></a>changes Dec. 1997)
<a name="line-19"></a>
<a name="line-20"></a>Two rather obscure features are missing: The Bash 2.0 non-option hack
<a name="line-21"></a>(if you don't already know it, you probably don't want to hear about
<a name="line-22"></a>it...) and the recognition of long options with a single dash
<a name="line-23"></a>(e.g. '-help' is recognised as '--help', as long as there is no short
<a name="line-24"></a>option 'h').
<a name="line-25"></a>
<a name="line-26"></a>Other differences between GNU's getopt and this implementation:
<a name="line-27"></a>
<a name="line-28"></a>* To enforce a coherent description of options and arguments, there
<a name="line-29"></a>  are explanation fields in the option/argument descriptor.
<a name="line-30"></a>
<a name="line-31"></a>* Error messages are now more informative, but no longer POSIX
<a name="line-32"></a>  compliant... :-(
<a name="line-33"></a>
<a name="line-34"></a>And a final Haskell advertisement: The GNU C implementation uses well
<a name="line-35"></a>over 1100 lines, we need only 195 here, including a 46 line example!
<a name="line-36"></a>:-)
<a name="line-37"></a>-}</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-comment'>{-# OPTIONS_HADDOCK hide #-}</span>
<a name="line-40"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>GetOpt</span> <span class='hs-layout'>(</span>
<a name="line-41"></a>   <span class='hs-comment'>-- * GetOpt</span>
<a name="line-42"></a>   <span class='hs-varid'>getOpt</span><span class='hs-layout'>,</span> <span class='hs-varid'>getOpt'</span><span class='hs-layout'>,</span>
<a name="line-43"></a>   <span class='hs-varid'>usageInfo</span><span class='hs-layout'>,</span>
<a name="line-44"></a>   <span class='hs-conid'>ArgOrder</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-45"></a>   <span class='hs-conid'>OptDescr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-46"></a>   <span class='hs-conid'>ArgDescr</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-47"></a>
<a name="line-48"></a>   <span class='hs-comment'>-- * Example</span>
<a name="line-49"></a>
<a name="line-50"></a>   <span class='hs-comment'>-- $example</span>
<a name="line-51"></a><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-52"></a>
<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'>List</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isPrefixOf</span><span class='hs-layout'>,</span> <span class='hs-varid'>intercalate</span><span class='hs-layout'>,</span> <span class='hs-varid'>find</span> <span class='hs-layout'>)</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'>Maybe</span> <span class='hs-layout'>(</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>)</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="ArgOrder"></a><span class='hs-comment'>-- |What to do with options following non-options</span>
<a name="line-57"></a><a name="ArgOrder"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ArgOrder</span> <span class='hs-varid'>a</span>
<a name="line-58"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RequireOrder</span>                <span class='hs-comment'>-- ^ no option processing after first non-option</span>
<a name="line-59"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Permute</span>                     <span class='hs-comment'>-- ^ freely intersperse options and non-options</span>
<a name="line-60"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ReturnInOrder</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ wrap non-options into options</span>
<a name="line-61"></a>
<a name="line-62"></a><a name="OptDescr"></a><span class='hs-comment'>{-|
<a name="line-63"></a>Each 'OptDescr' describes a single option.
<a name="line-64"></a>
<a name="line-65"></a>The arguments to 'Option' are:
<a name="line-66"></a>
<a name="line-67"></a>* list of short option characters
<a name="line-68"></a>
<a name="line-69"></a>* list of long option strings (without \"--\")
<a name="line-70"></a>
<a name="line-71"></a>* argument descriptor
<a name="line-72"></a>
<a name="line-73"></a>* explanation of option for user
<a name="line-74"></a>-}</span>
<a name="line-75"></a><a name="OptDescr"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span>              <span class='hs-comment'>-- description of a single options:</span>
<a name="line-76"></a>   <span class='hs-conid'>Option</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Char</span><span class='hs-keyglyph'>]</span>                <span class='hs-comment'>--    list of short option characters</span>
<a name="line-77"></a>          <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>              <span class='hs-comment'>--    list of long option strings (without "--")</span>
<a name="line-78"></a>          <span class='hs-layout'>(</span><span class='hs-conid'>ArgDescr</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>          <span class='hs-comment'>--    argument descriptor</span>
<a name="line-79"></a>          <span class='hs-conid'>String</span>                <span class='hs-comment'>--    explanation of option for user</span>
<a name="line-80"></a>
<a name="line-81"></a><a name="ArgDescr"></a><span class='hs-comment'>-- |Describes whether an option takes an argument or not, and if so</span>
<a name="line-82"></a><a name="ArgDescr"></a><span class='hs-comment'>-- how the argument is injected into a value of type @a@.</span>
<a name="line-83"></a><a name="ArgDescr"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ArgDescr</span> <span class='hs-varid'>a</span>
<a name="line-84"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoArg</span>                   <span class='hs-varid'>a</span>         <span class='hs-comment'>-- ^   no argument expected</span>
<a name="line-85"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ReqArg</span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^   option requires argument</span>
<a name="line-86"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OptArg</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^   optional argument</span>
<a name="line-87"></a>
<a name="line-88"></a><a name="OptKind"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>OptKind</span> <span class='hs-varid'>a</span>                <span class='hs-comment'>-- kind of cmd line arg (internal use only):</span>
<a name="line-89"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Opt</span>       <span class='hs-varid'>a</span>                <span class='hs-comment'>--    an option</span>
<a name="line-90"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>UnreqOpt</span>  <span class='hs-conid'>String</span>           <span class='hs-comment'>--    an un-recognized option</span>
<a name="line-91"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NonOpt</span>    <span class='hs-conid'>String</span>           <span class='hs-comment'>--    a non-option</span>
<a name="line-92"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>EndOfOpts</span>                  <span class='hs-comment'>--    end-of-options marker (i.e. "--")</span>
<a name="line-93"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OptErr</span>    <span class='hs-conid'>String</span>           <span class='hs-comment'>--    something went wrong...</span>
<a name="line-94"></a>
<a name="line-95"></a><a name="usageInfo"></a><span class='hs-comment'>-- | Return a string describing the usage of a command, derived from</span>
<a name="line-96"></a><span class='hs-comment'>-- the header (first argument) and the options described by the</span>
<a name="line-97"></a><span class='hs-comment'>-- second argument.</span>
<a name="line-98"></a><span class='hs-definition'>usageInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>                    <span class='hs-comment'>-- header</span>
<a name="line-99"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>              <span class='hs-comment'>-- option descriptors</span>
<a name="line-100"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>                    <span class='hs-comment'>-- nicely formatted decription of options</span>
<a name="line-101"></a><span class='hs-definition'>usageInfo</span> <span class='hs-varid'>header</span> <span class='hs-varid'>optDescr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unlines</span> <span class='hs-layout'>(</span><span class='hs-varid'>header</span><span class='hs-conop'>:</span><span class='hs-varid'>table</span><span class='hs-layout'>)</span>
<a name="line-102"></a>   <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>ss</span><span class='hs-layout'>,</span><span class='hs-varid'>ls</span><span class='hs-layout'>,</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip3</span> <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-varid'>intercalate</span> <span class='hs-str'>", "</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmtShort</span> <span class='hs-varid'>ad</span><span class='hs-layout'>)</span> <span class='hs-varid'>sos</span><span class='hs-layout'>)</span>
<a name="line-103"></a>                               <span class='hs-layout'>,</span><span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>fmtLong</span>  <span class='hs-varid'>ad</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>take</span> <span class='hs-num'>1</span> <span class='hs-varid'>los</span><span class='hs-layout'>)</span>
<a name="line-104"></a>                               <span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-105"></a>                             <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Option</span> <span class='hs-varid'>sos</span> <span class='hs-varid'>los</span> <span class='hs-varid'>ad</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>optDescr</span> <span class='hs-keyglyph'>]</span>
<a name="line-106"></a>         <span class='hs-varid'>ssWidth</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>maximum</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-varid'>length</span><span class='hs-layout'>)</span> <span class='hs-varid'>ss</span>
<a name="line-107"></a>         <span class='hs-varid'>lsWidth</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>maximum</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-varid'>length</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span>
<a name="line-108"></a>         <span class='hs-varid'>dsWidth</span>    <span class='hs-keyglyph'>=</span> <span class='hs-num'>30</span> <span class='hs-varop'>`max`</span> <span class='hs-layout'>(</span><span class='hs-num'>80</span> <span class='hs-comment'>-</span> <span class='hs-layout'>(</span><span class='hs-varid'>ssWidth</span> <span class='hs-varop'>+</span> <span class='hs-varid'>lsWidth</span> <span class='hs-varop'>+</span> <span class='hs-num'>3</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-109"></a>         <span class='hs-varid'>table</span>      <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-str'>" "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>padTo</span> <span class='hs-varid'>ssWidth</span> <span class='hs-varid'>so'</span> <span class='hs-varop'>++</span>
<a name="line-110"></a>                        <span class='hs-str'>" "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>padTo</span> <span class='hs-varid'>lsWidth</span> <span class='hs-varid'>lo'</span> <span class='hs-varop'>++</span>
<a name="line-111"></a>                        <span class='hs-str'>" "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>d'</span>
<a name="line-112"></a>                      <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>so</span><span class='hs-layout'>,</span><span class='hs-varid'>lo</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zip3</span> <span class='hs-varid'>ss</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>ds</span>
<a name="line-113"></a>                      <span class='hs-layout'>,</span> <span class='hs-layout'>(</span><span class='hs-varid'>so'</span><span class='hs-layout'>,</span><span class='hs-varid'>lo'</span><span class='hs-layout'>,</span><span class='hs-varid'>d'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fmtOpt</span> <span class='hs-varid'>dsWidth</span> <span class='hs-varid'>so</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>]</span>
<a name="line-114"></a>         <span class='hs-varid'>padTo</span> <span class='hs-varid'>n</span> <span class='hs-varid'>x</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>take</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>++</span> <span class='hs-varid'>repeat</span> <span class='hs-chr'>' '</span><span class='hs-layout'>)</span>
<a name="line-115"></a>
<a name="line-116"></a><a name="fmtOpt"></a><span class='hs-definition'>fmtOpt</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> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</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> <span class='hs-conid'>String</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-117"></a><span class='hs-definition'>fmtOpt</span> <span class='hs-varid'>descrWidth</span> <span class='hs-varid'>so</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>descr</span> <span class='hs-keyglyph'>=</span>
<a name="line-118"></a>   <span class='hs-keyword'>case</span> <span class='hs-varid'>wrapText</span> <span class='hs-varid'>descrWidth</span> <span class='hs-varid'>descr</span> <span class='hs-keyword'>of</span>
<a name="line-119"></a>     <span class='hs-conid'>[]</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>so</span><span class='hs-layout'>,</span><span class='hs-varid'>lo</span><span class='hs-layout'>,</span><span class='hs-str'>""</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-120"></a>     <span class='hs-layout'>(</span><span class='hs-varid'>d</span><span class='hs-conop'>:</span><span class='hs-varid'>ds</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>so</span><span class='hs-layout'>,</span><span class='hs-varid'>lo</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-str'>""</span><span class='hs-layout'>,</span><span class='hs-str'>""</span><span class='hs-layout'>,</span><span class='hs-varid'>d'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>d'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds</span> <span class='hs-keyglyph'>]</span>
<a name="line-121"></a>
<a name="line-122"></a><a name="fmtShort"></a><span class='hs-definition'>fmtShort</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ArgDescr</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-123"></a><span class='hs-definition'>fmtShort</span> <span class='hs-layout'>(</span><span class='hs-conid'>NoArg</span>  <span class='hs-keyword'>_</span>   <span class='hs-layout'>)</span> <span class='hs-varid'>so</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"-"</span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>so</span><span class='hs-keyglyph'>]</span>
<a name="line-124"></a><span class='hs-definition'>fmtShort</span> <span class='hs-layout'>(</span><span class='hs-conid'>ReqArg</span> <span class='hs-keyword'>_</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>so</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"-"</span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>so</span><span class='hs-keyglyph'>]</span>
<a name="line-125"></a><span class='hs-definition'>fmtShort</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptArg</span> <span class='hs-keyword'>_</span>  <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>so</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"-"</span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>so</span><span class='hs-keyglyph'>]</span>
<a name="line-126"></a>
<a name="line-127"></a><a name="fmtLong"></a><span class='hs-definition'>fmtLong</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ArgDescr</span> <span class='hs-varid'>a</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-128"></a><span class='hs-definition'>fmtLong</span> <span class='hs-layout'>(</span><span class='hs-conid'>NoArg</span>  <span class='hs-keyword'>_</span>   <span class='hs-layout'>)</span> <span class='hs-varid'>lo</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"--"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>lo</span>
<a name="line-129"></a><span class='hs-definition'>fmtLong</span> <span class='hs-layout'>(</span><span class='hs-conid'>ReqArg</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ad</span><span class='hs-layout'>)</span> <span class='hs-varid'>lo</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"--"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>lo</span> <span class='hs-varop'>++</span> <span class='hs-str'>"="</span> <span class='hs-varop'>++</span> <span class='hs-varid'>ad</span>
<a name="line-130"></a><span class='hs-definition'>fmtLong</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptArg</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ad</span><span class='hs-layout'>)</span> <span class='hs-varid'>lo</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"--"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>lo</span> <span class='hs-varop'>++</span> <span class='hs-str'>"[="</span> <span class='hs-varop'>++</span> <span class='hs-varid'>ad</span> <span class='hs-varop'>++</span> <span class='hs-str'>"]"</span>
<a name="line-131"></a>
<a name="line-132"></a><a name="wrapText"></a><span class='hs-definition'>wrapText</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-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-133"></a><span class='hs-definition'>wrapText</span> <span class='hs-varid'>width</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>unwords</span> <span class='hs-varop'>.</span> <span class='hs-varid'>wrap</span> <span class='hs-num'>0</span> <span class='hs-conid'>[]</span> <span class='hs-varop'>.</span> <span class='hs-varid'>words</span>
<a name="line-134"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>wrap</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</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-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</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'>]</span>
<a name="line-135"></a>        <span class='hs-varid'>wrap</span> <span class='hs-num'>0</span>   <span class='hs-conid'>[]</span>   <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-conop'>:</span><span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-136"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>length</span> <span class='hs-varid'>w</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>width</span>
<a name="line-137"></a>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrap</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>w</span><span class='hs-keyglyph'>]</span> <span class='hs-varid'>ws</span>
<a name="line-138"></a>        <span class='hs-varid'>wrap</span> <span class='hs-varid'>col</span> <span class='hs-varid'>line</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-conop'>:</span><span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-139"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>col</span> <span class='hs-varop'>+</span> <span class='hs-varid'>length</span> <span class='hs-varid'>w</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>width</span>
<a name="line-140"></a>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reverse</span> <span class='hs-varid'>line</span> <span class='hs-conop'>:</span> <span class='hs-varid'>wrap</span> <span class='hs-num'>0</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-conop'>:</span><span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-141"></a>        <span class='hs-varid'>wrap</span> <span class='hs-varid'>col</span> <span class='hs-varid'>line</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-conop'>:</span><span class='hs-varid'>ws</span><span class='hs-layout'>)</span>
<a name="line-142"></a>          <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>col'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>col</span> <span class='hs-varop'>+</span> <span class='hs-varid'>length</span> <span class='hs-varid'>w</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span>
<a name="line-143"></a>             <span class='hs-keyword'>in</span> <span class='hs-varid'>wrap</span> <span class='hs-varid'>col'</span> <span class='hs-layout'>(</span><span class='hs-varid'>w</span><span class='hs-conop'>:</span><span class='hs-varid'>line</span><span class='hs-layout'>)</span> <span class='hs-varid'>ws</span>
<a name="line-144"></a>        <span class='hs-varid'>wrap</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span>   <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-145"></a>        <span class='hs-varid'>wrap</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>line</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>reverse</span> <span class='hs-varid'>line</span><span class='hs-keyglyph'>]</span>
<a name="line-146"></a>
<a name="line-147"></a><a name="getOpt"></a><span class='hs-comment'>{-|
<a name="line-148"></a>Process the command-line, and return the list of values that matched
<a name="line-149"></a>(and those that didn\'t). The arguments are:
<a name="line-150"></a>
<a name="line-151"></a>* The order requirements (see 'ArgOrder')
<a name="line-152"></a>
<a name="line-153"></a>* The option descriptions (see 'OptDescr')
<a name="line-154"></a>
<a name="line-155"></a>* The actual command line arguments (presumably got from
<a name="line-156"></a>  'System.Environment.getArgs').
<a name="line-157"></a>
<a name="line-158"></a>'getOpt' returns a triple consisting of the option arguments, a list
<a name="line-159"></a>of non-options, and a list of error messages.
<a name="line-160"></a>-}</span>
<a name="line-161"></a><span class='hs-definition'>getOpt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ArgOrder</span> <span class='hs-varid'>a</span>                   <span class='hs-comment'>-- non-option handling</span>
<a name="line-162"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>                 <span class='hs-comment'>-- option descriptors</span>
<a name="line-163"></a>       <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-comment'>-- the command-line arguments</span>
<a name="line-164"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>      <span class='hs-comment'>-- (options,non-options,error messages)</span>
<a name="line-165"></a><span class='hs-definition'>getOpt</span> <span class='hs-varid'>ordering</span> <span class='hs-varid'>optDescr</span> <span class='hs-varid'>args</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>os</span><span class='hs-layout'>,</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span> <span class='hs-varop'>++</span> <span class='hs-varid'>map</span> <span class='hs-varid'>errUnrec</span> <span class='hs-varid'>us</span><span class='hs-layout'>)</span>
<a name="line-166"></a>   <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>os</span><span class='hs-layout'>,</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getOpt'</span> <span class='hs-varid'>ordering</span> <span class='hs-varid'>optDescr</span> <span class='hs-varid'>args</span>
<a name="line-167"></a>
<a name="line-168"></a><a name="getOpt'"></a><span class='hs-comment'>{-|
<a name="line-169"></a>This is almost the same as 'getOpt', but returns a quadruple
<a name="line-170"></a>consisting of the option arguments, a list of non-options, a list of
<a name="line-171"></a>unrecognized options, and a list of error messages.
<a name="line-172"></a>-}</span>
<a name="line-173"></a><span class='hs-definition'>getOpt'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ArgOrder</span> <span class='hs-varid'>a</span>                         <span class='hs-comment'>-- non-option handling</span>
<a name="line-174"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>                       <span class='hs-comment'>-- option descriptors</span>
<a name="line-175"></a>        <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-comment'>-- the command-line arguments</span>
<a name="line-176"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- (options,non-options,unrecognized,error messages)</span>
<a name="line-177"></a><span class='hs-definition'>getOpt'</span> <span class='hs-keyword'>_</span>        <span class='hs-keyword'>_</span>        <span class='hs-conid'>[]</span>         <span class='hs-keyglyph'>=</span>  <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-178"></a><span class='hs-definition'>getOpt'</span> <span class='hs-varid'>ordering</span> <span class='hs-varid'>optDescr</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg</span><span class='hs-conop'>:</span><span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>procNextOpt</span> <span class='hs-varid'>opt</span> <span class='hs-varid'>ordering</span>
<a name="line-179"></a>   <span class='hs-keyword'>where</span> <span class='hs-varid'>procNextOpt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-varid'>o</span><span class='hs-layout'>)</span>      <span class='hs-keyword'>_</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>o</span><span class='hs-conop'>:</span><span class='hs-varid'>os</span><span class='hs-layout'>,</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-180"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-layout'>(</span><span class='hs-conid'>UnreqOpt</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>os</span><span class='hs-layout'>,</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-conop'>:</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-181"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonOpt</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>   <span class='hs-conid'>RequireOrder</span>      <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-182"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonOpt</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>   <span class='hs-conid'>Permute</span>           <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>os</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-varid'>us</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-183"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonOpt</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>   <span class='hs-layout'>(</span><span class='hs-conid'>ReturnInOrder</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span> <span class='hs-conop'>:</span><span class='hs-varid'>os</span><span class='hs-layout'>,</span> <span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-184"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-conid'>EndOfOpts</span>    <span class='hs-conid'>RequireOrder</span>      <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-185"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-conid'>EndOfOpts</span>    <span class='hs-conid'>Permute</span>           <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-186"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-conid'>EndOfOpts</span>    <span class='hs-layout'>(</span><span class='hs-conid'>ReturnInOrder</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>f</span> <span class='hs-varid'>rest</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-187"></a>         <span class='hs-varid'>procNextOpt</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptErr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>   <span class='hs-keyword'>_</span>                 <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>os</span><span class='hs-layout'>,</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span><span class='hs-varid'>e</span><span class='hs-conop'>:</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span>
<a name="line-188"></a>
<a name="line-189"></a>         <span class='hs-layout'>(</span><span class='hs-varid'>opt</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getNext</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>args</span> <span class='hs-varid'>optDescr</span>
<a name="line-190"></a>         <span class='hs-layout'>(</span><span class='hs-varid'>os</span><span class='hs-layout'>,</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span><span class='hs-varid'>us</span><span class='hs-layout'>,</span><span class='hs-varid'>es</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getOpt'</span> <span class='hs-varid'>ordering</span> <span class='hs-varid'>optDescr</span> <span class='hs-varid'>rest</span>
<a name="line-191"></a>
<a name="line-192"></a><a name="getNext"></a><span class='hs-comment'>-- take a look at the next cmd line arg and decide what to do with it</span>
<a name="line-193"></a><span class='hs-definition'>getNext</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-keyglyph'>[</span><span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptKind</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-194"></a><span class='hs-definition'>getNext</span> <span class='hs-layout'>(</span><span class='hs-chr'>'-'</span><span class='hs-conop'>:</span><span class='hs-chr'>'-'</span><span class='hs-conop'>:</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-varid'>rest</span> <span class='hs-keyword'>_</span>        <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>EndOfOpts</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-195"></a><span class='hs-definition'>getNext</span> <span class='hs-layout'>(</span><span class='hs-chr'>'-'</span><span class='hs-conop'>:</span><span class='hs-chr'>'-'</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>optDescr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>longOpt</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>optDescr</span>
<a name="line-196"></a><span class='hs-definition'>getNext</span> <span class='hs-layout'>(</span><span class='hs-chr'>'-'</span><span class='hs-conop'>:</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-varid'>rest</span> <span class='hs-varid'>optDescr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>shortOpt</span> <span class='hs-varid'>x</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>rest</span> <span class='hs-varid'>optDescr</span>
<a name="line-197"></a><span class='hs-definition'>getNext</span> <span class='hs-varid'>a</span>            <span class='hs-varid'>rest</span> <span class='hs-keyword'>_</span>        <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>NonOpt</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-198"></a>
<a name="line-199"></a><a name="longOpt"></a><span class='hs-comment'>-- handle long option</span>
<a name="line-200"></a><span class='hs-definition'>longOpt</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-keyglyph'>[</span><span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptKind</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-201"></a><span class='hs-definition'>longOpt</span> <span class='hs-varid'>ls</span> <span class='hs-varid'>rs</span> <span class='hs-varid'>optDescr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>long</span> <span class='hs-varid'>ads</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>rs</span>
<a name="line-202"></a>   <span class='hs-keyword'>where</span> <span class='hs-layout'>(</span><span class='hs-varid'>opt</span><span class='hs-layout'>,</span><span class='hs-varid'>arg</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>break</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-chr'>'='</span><span class='hs-layout'>)</span> <span class='hs-varid'>ls</span>
<a name="line-203"></a>         <span class='hs-varid'>getWith</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>o</span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>o</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Option</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>xs</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>optDescr</span>
<a name="line-204"></a>                          <span class='hs-layout'>,</span> <span class='hs-varid'>isJust</span> <span class='hs-layout'>(</span><span class='hs-varid'>find</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span> <span class='hs-varid'>opt</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-205"></a>         <span class='hs-varid'>exact</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getWith</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span><span class='hs-layout'>)</span>
<a name="line-206"></a>         <span class='hs-varid'>options</span>   <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>exact</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>getWith</span> <span class='hs-varid'>isPrefixOf</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>exact</span>
<a name="line-207"></a>         <span class='hs-varid'>ads</span>       <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>ad</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Option</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ad</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>options</span> <span class='hs-keyglyph'>]</span>
<a name="line-208"></a>         <span class='hs-varid'>optStr</span>    <span class='hs-keyglyph'>=</span> <span class='hs-str'>"--"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>opt</span>
<a name="line-209"></a>
<a name="line-210"></a>         <span class='hs-varid'>long</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span>      <span class='hs-keyword'>_</span>        <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>errAmbig</span> <span class='hs-varid'>options</span> <span class='hs-varid'>optStr</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-211"></a>         <span class='hs-varid'>long</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NoArg</span>  <span class='hs-varid'>a</span>  <span class='hs-keyglyph'>]</span> <span class='hs-conid'>[]</span>       <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-212"></a>         <span class='hs-varid'>long</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>NoArg</span>  <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-chr'>'='</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>errNoArg</span> <span class='hs-varid'>optStr</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-213"></a>         <span class='hs-varid'>long</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ReqArg</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>[]</span>       <span class='hs-conid'>[]</span>       <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>errReq</span> <span class='hs-varid'>d</span> <span class='hs-varid'>optStr</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-214"></a>         <span class='hs-varid'>long</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ReqArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>[]</span>       <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-215"></a>         <span class='hs-varid'>long</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ReqArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-chr'>'='</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-216"></a>         <span class='hs-varid'>long</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OptArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-conid'>[]</span>       <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-217"></a>         <span class='hs-varid'>long</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OptArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-chr'>'='</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-218"></a>         <span class='hs-varid'>long</span> <span class='hs-keyword'>_</span>            <span class='hs-keyword'>_</span>        <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>UnreqOpt</span> <span class='hs-layout'>(</span><span class='hs-str'>"--"</span><span class='hs-varop'>++</span><span class='hs-varid'>ls</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-219"></a>
<a name="line-220"></a><a name="shortOpt"></a><span class='hs-comment'>-- handle short option</span>
<a name="line-221"></a><span class='hs-definition'>shortOpt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-&gt;</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-keyglyph'>[</span><span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptKind</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-222"></a><span class='hs-definition'>shortOpt</span> <span class='hs-varid'>y</span> <span class='hs-varid'>ys</span> <span class='hs-varid'>rs</span> <span class='hs-varid'>optDescr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>short</span> <span class='hs-varid'>ads</span> <span class='hs-varid'>ys</span> <span class='hs-varid'>rs</span>
<a name="line-223"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>options</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>o</span>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>o</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>Option</span> <span class='hs-varid'>ss</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>optDescr</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ss</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span> <span class='hs-varop'>==</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>]</span>
<a name="line-224"></a>        <span class='hs-varid'>ads</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>ad</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Option</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ad</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>options</span> <span class='hs-keyglyph'>]</span>
<a name="line-225"></a>        <span class='hs-varid'>optStr</span>  <span class='hs-keyglyph'>=</span> <span class='hs-chr'>'-'</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>y</span><span class='hs-keyglyph'>]</span>
<a name="line-226"></a>
<a name="line-227"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span>        <span class='hs-keyword'>_</span>  <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>errAmbig</span> <span class='hs-varid'>options</span> <span class='hs-varid'>optStr</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-228"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-conid'>NoArg</span>  <span class='hs-varid'>a</span>  <span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-229"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-conid'>NoArg</span>  <span class='hs-varid'>a</span>  <span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-varid'>a</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-chr'>'-'</span><span class='hs-conop'>:</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-230"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-conid'>ReqArg</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>d</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span>       <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>errReq</span> <span class='hs-varid'>d</span> <span class='hs-varid'>optStr</span><span class='hs-layout'>,</span><span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-231"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-conid'>ReqArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-232"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-conid'>ReqArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-233"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-234"></a>        <span class='hs-varid'>short</span> <span class='hs-layout'>(</span><span class='hs-conid'>OptArg</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-conop'>:</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-varid'>xs</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Opt</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-235"></a>        <span class='hs-varid'>short</span> <span class='hs-conid'>[]</span>             <span class='hs-conid'>[]</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>UnreqOpt</span> <span class='hs-varid'>optStr</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-236"></a>        <span class='hs-varid'>short</span> <span class='hs-conid'>[]</span>             <span class='hs-varid'>xs</span> <span class='hs-varid'>rest</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>UnreqOpt</span> <span class='hs-layout'>(</span><span class='hs-varid'>optStr</span><span class='hs-varop'>++</span><span class='hs-varid'>xs</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span>
<a name="line-237"></a>
<a name="line-238"></a><span class='hs-comment'>-- miscellaneous error formatting</span>
<a name="line-239"></a>
<a name="line-240"></a><a name="errAmbig"></a><span class='hs-definition'>errAmbig</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OptDescr</span> <span class='hs-varid'>a</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'>OptKind</span> <span class='hs-varid'>a</span>
<a name="line-241"></a><span class='hs-definition'>errAmbig</span> <span class='hs-varid'>ods</span> <span class='hs-varid'>optStr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OptErr</span> <span class='hs-layout'>(</span><span class='hs-varid'>usageInfo</span> <span class='hs-varid'>header</span> <span class='hs-varid'>ods</span><span class='hs-layout'>)</span>
<a name="line-242"></a>   <span class='hs-keyword'>where</span> <span class='hs-varid'>header</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"option `"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>optStr</span> <span class='hs-varop'>++</span> <span class='hs-str'>"' is ambiguous; could be one of:"</span>
<a name="line-243"></a>
<a name="line-244"></a><a name="errReq"></a><span class='hs-definition'>errReq</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OptKind</span> <span class='hs-varid'>a</span>
<a name="line-245"></a><span class='hs-definition'>errReq</span> <span class='hs-varid'>d</span> <span class='hs-varid'>optStr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OptErr</span> <span class='hs-layout'>(</span><span class='hs-str'>"option `"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>optStr</span> <span class='hs-varop'>++</span> <span class='hs-str'>"' requires an argument "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>d</span> <span class='hs-varop'>++</span> <span class='hs-str'>"\n"</span><span class='hs-layout'>)</span>
<a name="line-246"></a>
<a name="line-247"></a><a name="errUnrec"></a><span class='hs-definition'>errUnrec</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-248"></a><span class='hs-definition'>errUnrec</span> <span class='hs-varid'>optStr</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"unrecognized option `"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>optStr</span> <span class='hs-varop'>++</span> <span class='hs-str'>"'\n"</span>
<a name="line-249"></a>
<a name="line-250"></a><a name="errNoArg"></a><span class='hs-definition'>errNoArg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OptKind</span> <span class='hs-varid'>a</span>
<a name="line-251"></a><span class='hs-definition'>errNoArg</span> <span class='hs-varid'>optStr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>OptErr</span> <span class='hs-layout'>(</span><span class='hs-str'>"option `"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>optStr</span> <span class='hs-varop'>++</span> <span class='hs-str'>"' doesn't allow an argument\n"</span><span class='hs-layout'>)</span>
<a name="line-252"></a>
<a name="line-253"></a><span class='hs-comment'>{-
<a name="line-254"></a>-----------------------------------------------------------------------------------------
<a name="line-255"></a>-- and here a small and hopefully enlightening example:
<a name="line-256"></a>
<a name="line-257"></a>data Flag = Verbose | Version | Name String | Output String | Arg String   deriving Show
<a name="line-258"></a>
<a name="line-259"></a>options :: [OptDescr Flag]
<a name="line-260"></a>options =
<a name="line-261"></a>   [Option ['v']     ["verbose"]           (NoArg Verbose)      "verbosely list files",
<a name="line-262"></a>    Option ['V','?'] ["version","release"] (NoArg Version)      "show version info",
<a name="line-263"></a>    Option ['o']     ["output"]            (OptArg out "FILE")  "use FILE for dump",
<a name="line-264"></a>    Option ['n']     ["name"]              (ReqArg Name "USER") "only dump USER's files"]
<a name="line-265"></a>
<a name="line-266"></a>out :: Maybe String -&gt; Flag
<a name="line-267"></a>out Nothing  = Output "stdout"
<a name="line-268"></a>out (Just o) = Output o
<a name="line-269"></a>
<a name="line-270"></a>test :: ArgOrder Flag -&gt; [String] -&gt; String
<a name="line-271"></a>test order cmdline = case getOpt order options cmdline of
<a name="line-272"></a>                        (o,n,[]  ) -&gt; "options=" ++ show o ++ "  args=" ++ show n ++ "\n"
<a name="line-273"></a>                        (_,_,errs) -&gt; concat errs ++ usageInfo header options
<a name="line-274"></a>   where header = "Usage: foobar [OPTION...] files..."
<a name="line-275"></a>
<a name="line-276"></a>-- example runs:
<a name="line-277"></a>-- putStr (test RequireOrder ["foo","-v"])
<a name="line-278"></a>--    ==&gt; options=[]  args=["foo", "-v"]
<a name="line-279"></a>-- putStr (test Permute ["foo","-v"])
<a name="line-280"></a>--    ==&gt; options=[Verbose]  args=["foo"]
<a name="line-281"></a>-- putStr (test (ReturnInOrder Arg) ["foo","-v"])
<a name="line-282"></a>--    ==&gt; options=[Arg "foo", Verbose]  args=[]
<a name="line-283"></a>-- putStr (test Permute ["foo","--","-v"])
<a name="line-284"></a>--    ==&gt; options=[]  args=["foo", "-v"]
<a name="line-285"></a>-- putStr (test Permute ["-?o","--name","bar","--na=baz"])
<a name="line-286"></a>--    ==&gt; options=[Version, Output "stdout", Name "bar", Name "baz"]  args=[]
<a name="line-287"></a>-- putStr (test Permute ["--ver","foo"])
<a name="line-288"></a>--    ==&gt; option `--ver' is ambiguous; could be one of:
<a name="line-289"></a>--          -v      --verbose             verbosely list files
<a name="line-290"></a>--          -V, -?  --version, --release  show version info
<a name="line-291"></a>--        Usage: foobar [OPTION...] files...
<a name="line-292"></a>--          -v        --verbose             verbosely list files
<a name="line-293"></a>--          -V, -?    --version, --release  show version info
<a name="line-294"></a>--          -o[FILE]  --output[=FILE]       use FILE for dump
<a name="line-295"></a>--          -n USER   --name=USER           only dump USER's files
<a name="line-296"></a>-----------------------------------------------------------------------------------------
<a name="line-297"></a>-}</span>
<a name="line-298"></a>
<a name="line-299"></a><span class='hs-comment'>{- $example
<a name="line-300"></a>
<a name="line-301"></a>To hopefully illuminate the role of the different data
<a name="line-302"></a>structures, here\'s the command-line options for a (very simple)
<a name="line-303"></a>compiler:
<a name="line-304"></a>
<a name="line-305"></a>&gt;    module Opts where
<a name="line-306"></a>&gt;
<a name="line-307"></a>&gt;    import Distribution.GetOpt
<a name="line-308"></a>&gt;    import Data.Maybe ( fromMaybe )
<a name="line-309"></a>&gt;
<a name="line-310"></a>&gt;    data Flag
<a name="line-311"></a>&gt;     = Verbose  | Version
<a name="line-312"></a>&gt;     | Input String | Output String | LibDir String
<a name="line-313"></a>&gt;       deriving Show
<a name="line-314"></a>&gt;
<a name="line-315"></a>&gt;    options :: [OptDescr Flag]
<a name="line-316"></a>&gt;    options =
<a name="line-317"></a>&gt;     [ Option ['v']     ["verbose"] (NoArg Verbose)       "chatty output on stderr"
<a name="line-318"></a>&gt;     , Option ['V','?'] ["version"] (NoArg Version)       "show version number"
<a name="line-319"></a>&gt;     , Option ['o']     ["output"]  (OptArg outp "FILE")  "output FILE"
<a name="line-320"></a>&gt;     , Option ['c']     []          (OptArg inp  "FILE")  "input FILE"
<a name="line-321"></a>&gt;     , Option ['L']     ["libdir"]  (ReqArg LibDir "DIR") "library directory"
<a name="line-322"></a>&gt;     ]
<a name="line-323"></a>&gt;
<a name="line-324"></a>&gt;    inp,outp :: Maybe String -&gt; Flag
<a name="line-325"></a>&gt;    outp = Output . fromMaybe "stdout"
<a name="line-326"></a>&gt;    inp  = Input  . fromMaybe "stdin"
<a name="line-327"></a>&gt;
<a name="line-328"></a>&gt;    compilerOpts :: [String] -&gt; IO ([Flag], [String])
<a name="line-329"></a>&gt;    compilerOpts argv =
<a name="line-330"></a>&gt;       case getOpt Permute options argv of
<a name="line-331"></a>&gt;          (o,n,[]  ) -&gt; return (o,n)
<a name="line-332"></a>&gt;          (_,_,errs) -&gt; ioError (userError (concat errs ++ usageInfo header options))
<a name="line-333"></a>&gt;      where header = "Usage: ic [OPTION...] files..."
<a name="line-334"></a>
<a name="line-335"></a>-}</span>
</pre></body>
</html>