This file is indexed.

/usr/share/doc/libghc-cabal-doc/html/src/Distribution-Simple-Program-Db.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
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
<?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/Simple/Program/Db.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.Simple.Program.Db</span>
<a name="line-4"></a><span class='hs-comment'>-- Copyright   :  Isaac Jones 2006, Duncan Coutts 2007-2009</span>
<a name="line-5"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><span class='hs-comment'>-- Maintainer  :  cabal-devel@haskell.org</span>
<a name="line-7"></a><span class='hs-comment'>-- Portability :  portable</span>
<a name="line-8"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><span class='hs-comment'>-- This provides a 'ProgramDb' type which holds configured and not-yet</span>
<a name="line-10"></a><span class='hs-comment'>-- configured programs. It is the parameter to lots of actions elsewhere in</span>
<a name="line-11"></a><span class='hs-comment'>-- Cabal that need to look up and run programs. If we had a Cabal monad,</span>
<a name="line-12"></a><span class='hs-comment'>-- the 'ProgramDb' would probably be a reader or state component of it.</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>-- One nice thing about using it is that any program that is</span>
<a name="line-15"></a><span class='hs-comment'>-- registered with Cabal will get some \"configure\" and \".cabal\"</span>
<a name="line-16"></a><span class='hs-comment'>-- helpers like --with-foo-args --foo-path= and extra-foo-args.</span>
<a name="line-17"></a><span class='hs-comment'>--</span>
<a name="line-18"></a><span class='hs-comment'>-- There's also a hook for adding programs in a Setup.lhs script.  See</span>
<a name="line-19"></a><span class='hs-comment'>-- hookedPrograms in 'Distribution.Simple.UserHooks'.  This gives a</span>
<a name="line-20"></a><span class='hs-comment'>-- hook user the ability to get the above flags and such so that they</span>
<a name="line-21"></a><span class='hs-comment'>-- don't have to write all the PATH logic inside Setup.lhs.</span>
<a name="line-22"></a>
<a name="line-23"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Program</span><span class='hs-varop'>.</span><span class='hs-conid'>Db</span> <span class='hs-layout'>(</span>
<a name="line-24"></a>    <span class='hs-comment'>-- * The collection of configured programs we can run</span>
<a name="line-25"></a>    <span class='hs-conid'>ProgramDb</span><span class='hs-layout'>,</span>
<a name="line-26"></a>    <span class='hs-varid'>emptyProgramDb</span><span class='hs-layout'>,</span>
<a name="line-27"></a>    <span class='hs-varid'>defaultProgramDb</span><span class='hs-layout'>,</span>
<a name="line-28"></a>    <span class='hs-varid'>restoreProgramDb</span><span class='hs-layout'>,</span>
<a name="line-29"></a>
<a name="line-30"></a>    <span class='hs-comment'>-- ** Query and manipulate the program db</span>
<a name="line-31"></a>    <span class='hs-varid'>addKnownProgram</span><span class='hs-layout'>,</span>
<a name="line-32"></a>    <span class='hs-varid'>addKnownPrograms</span><span class='hs-layout'>,</span>
<a name="line-33"></a>    <span class='hs-varid'>lookupKnownProgram</span><span class='hs-layout'>,</span>
<a name="line-34"></a>    <span class='hs-varid'>knownPrograms</span><span class='hs-layout'>,</span>
<a name="line-35"></a>    <span class='hs-varid'>getProgramSearchPath</span><span class='hs-layout'>,</span>
<a name="line-36"></a>    <span class='hs-varid'>setProgramSearchPath</span><span class='hs-layout'>,</span>
<a name="line-37"></a>    <span class='hs-varid'>modifyProgramSearchPath</span><span class='hs-layout'>,</span>
<a name="line-38"></a>    <span class='hs-varid'>userSpecifyPath</span><span class='hs-layout'>,</span>
<a name="line-39"></a>    <span class='hs-varid'>userSpecifyPaths</span><span class='hs-layout'>,</span>
<a name="line-40"></a>    <span class='hs-varid'>userMaybeSpecifyPath</span><span class='hs-layout'>,</span>
<a name="line-41"></a>    <span class='hs-varid'>userSpecifyArgs</span><span class='hs-layout'>,</span>
<a name="line-42"></a>    <span class='hs-varid'>userSpecifyArgss</span><span class='hs-layout'>,</span>
<a name="line-43"></a>    <span class='hs-varid'>userSpecifiedArgs</span><span class='hs-layout'>,</span>
<a name="line-44"></a>    <span class='hs-varid'>lookupProgram</span><span class='hs-layout'>,</span>
<a name="line-45"></a>    <span class='hs-varid'>updateProgram</span><span class='hs-layout'>,</span>
<a name="line-46"></a>    <span class='hs-varid'>configuredPrograms</span><span class='hs-layout'>,</span>
<a name="line-47"></a>
<a name="line-48"></a>    <span class='hs-comment'>-- ** Query and manipulate the program db</span>
<a name="line-49"></a>    <span class='hs-varid'>configureProgram</span><span class='hs-layout'>,</span>
<a name="line-50"></a>    <span class='hs-varid'>configureAllKnownPrograms</span><span class='hs-layout'>,</span>
<a name="line-51"></a>    <span class='hs-varid'>lookupProgramVersion</span><span class='hs-layout'>,</span>
<a name="line-52"></a>    <span class='hs-varid'>reconfigurePrograms</span><span class='hs-layout'>,</span>
<a name="line-53"></a>    <span class='hs-varid'>requireProgram</span><span class='hs-layout'>,</span>
<a name="line-54"></a>    <span class='hs-varid'>requireProgramVersion</span><span class='hs-layout'>,</span>
<a name="line-55"></a>
<a name="line-56"></a>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Program</span><span class='hs-varop'>.</span><span class='hs-conid'>Types</span>
<a name="line-59"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Program</span><span class='hs-varop'>.</span><span class='hs-conid'>Find</span>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Program</span><span class='hs-varop'>.</span><span class='hs-conid'>Builtin</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Simple</span><span class='hs-varop'>.</span><span class='hs-conid'>Utils</span>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Version</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Text</span>
<a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Verbosity</span>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Distribution</span><span class='hs-varop'>.</span><span class='hs-conid'>Compat</span><span class='hs-varop'>.</span><span class='hs-conid'>Binary</span>
<a name="line-66"></a>
<a name="line-67"></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-68"></a>         <span class='hs-layout'>(</span> <span class='hs-varid'>foldl'</span> <span class='hs-layout'>)</span>
<a name="line-69"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
<a name="line-70"></a>         <span class='hs-layout'>(</span> <span class='hs-varid'>catMaybes</span> <span class='hs-layout'>)</span>
<a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Tuple</span> <span class='hs-layout'>(</span><span class='hs-varid'>swap</span><span class='hs-layout'>)</span>
<a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Map</span>
<a name="line-73"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-74"></a>         <span class='hs-layout'>(</span> <span class='hs-varid'>join</span><span class='hs-layout'>,</span> <span class='hs-varid'>foldM</span> <span class='hs-layout'>)</span>
<a name="line-75"></a>
<a name="line-76"></a><span class='hs-comment'>-- ------------------------------------------------------------</span>
<a name="line-77"></a><span class='hs-comment'>-- * Programs database</span>
<a name="line-78"></a><span class='hs-comment'>-- ------------------------------------------------------------</span>
<a name="line-79"></a>
<a name="line-80"></a><a name="ProgramDb"></a><span class='hs-comment'>-- | The configuration is a collection of information about programs. It</span>
<a name="line-81"></a><a name="ProgramDb"></a><span class='hs-comment'>-- contains information both about configured programs and also about programs</span>
<a name="line-82"></a><a name="ProgramDb"></a><span class='hs-comment'>-- that we are yet to configure.</span>
<a name="line-83"></a><a name="ProgramDb"></a><span class='hs-comment'>--</span>
<a name="line-84"></a><a name="ProgramDb"></a><span class='hs-comment'>-- The idea is that we start from a collection of unconfigured programs and one</span>
<a name="line-85"></a><a name="ProgramDb"></a><span class='hs-comment'>-- by one we try to configure them at which point we move them into the</span>
<a name="line-86"></a><a name="ProgramDb"></a><span class='hs-comment'>-- configured collection. For unconfigured programs we record not just the</span>
<a name="line-87"></a><a name="ProgramDb"></a><span class='hs-comment'>-- 'Program' but also any user-provided arguments and location for the program.</span>
<a name="line-88"></a><a name="ProgramDb"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-layout'>{</span>
<a name="line-89"></a>        <span class='hs-varid'>unconfiguredProgs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UnconfiguredProgs</span><span class='hs-layout'>,</span>
<a name="line-90"></a>        <span class='hs-varid'>progSearchPath</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramSearchPath</span><span class='hs-layout'>,</span>
<a name="line-91"></a>        <span class='hs-varid'>configuredProgs</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ConfiguredProgs</span>
<a name="line-92"></a>    <span class='hs-layout'>}</span>
<a name="line-93"></a>
<a name="line-94"></a><a name="UnconfiguredProgram"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>UnconfiguredProgram</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Program</span><span class='hs-layout'>,</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ProgArg</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-95"></a><a name="UnconfiguredProgs"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>UnconfiguredProgs</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-conid'>String</span> <span class='hs-conid'>UnconfiguredProgram</span>
<a name="line-96"></a><a name="ConfiguredProgs"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ConfiguredProgs</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-conid'>Map</span> <span class='hs-conid'>String</span> <span class='hs-conid'>ConfiguredProgram</span>
<a name="line-97"></a>
<a name="line-98"></a>
<a name="line-99"></a><a name="emptyProgramDb"></a><span class='hs-definition'>emptyProgramDb</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-100"></a><span class='hs-definition'>emptyProgramDb</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span> <span class='hs-varid'>defaultProgramSearchPath</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="defaultProgramDb"></a><span class='hs-definition'>defaultProgramDb</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-103"></a><span class='hs-definition'>defaultProgramDb</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>restoreProgramDb</span> <span class='hs-varid'>builtinPrograms</span> <span class='hs-varid'>emptyProgramDb</span>
<a name="line-104"></a>
<a name="line-105"></a>
<a name="line-106"></a><a name="updateUnconfiguredProgs"></a><span class='hs-comment'>-- internal helpers:</span>
<a name="line-107"></a><span class='hs-definition'>updateUnconfiguredProgs</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>UnconfiguredProgs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>UnconfiguredProgs</span><span class='hs-layout'>)</span>
<a name="line-108"></a>                        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-109"></a><span class='hs-definition'>updateUnconfiguredProgs</span> <span class='hs-varid'>update</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span>
<a name="line-110"></a>  <span class='hs-varid'>conf</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unconfiguredProgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>update</span> <span class='hs-layout'>(</span><span class='hs-varid'>unconfiguredProgs</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-111"></a>
<a name="line-112"></a><a name="updateConfiguredProgs"></a><span class='hs-definition'>updateConfiguredProgs</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConfiguredProgs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ConfiguredProgs</span><span class='hs-layout'>)</span>
<a name="line-113"></a>                      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-114"></a><span class='hs-definition'>updateConfiguredProgs</span> <span class='hs-varid'>update</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span>
<a name="line-115"></a>  <span class='hs-varid'>conf</span> <span class='hs-layout'>{</span> <span class='hs-varid'>configuredProgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>update</span> <span class='hs-layout'>(</span><span class='hs-varid'>configuredProgs</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-116"></a>
<a name="line-117"></a>
<a name="line-118"></a><span class='hs-comment'>-- Read &amp; Show instances are based on listToFM</span>
<a name="line-119"></a>
<a name="line-120"></a><a name="instance%20Show%20ProgramDb"></a><span class='hs-comment'>-- | Note that this instance does not preserve the known 'Program's.</span>
<a name="line-121"></a><a name="instance%20Show%20ProgramDb"></a><span class='hs-comment'>-- See 'restoreProgramDb' for details.</span>
<a name="line-122"></a><a name="instance%20Show%20ProgramDb"></a><span class='hs-comment'>--</span>
<a name="line-123"></a><a name="instance%20Show%20ProgramDb"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyword'>where</span>
<a name="line-124"></a>  <span class='hs-varid'>show</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>toAscList</span> <span class='hs-varop'>.</span> <span class='hs-varid'>configuredProgs</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="instance%20Read%20ProgramDb"></a><span class='hs-comment'>-- | Note that this instance does not preserve the known 'Program's.</span>
<a name="line-127"></a><a name="instance%20Read%20ProgramDb"></a><span class='hs-comment'>-- See 'restoreProgramDb' for details.</span>
<a name="line-128"></a><a name="instance%20Read%20ProgramDb"></a><span class='hs-comment'>--</span>
<a name="line-129"></a><a name="instance%20Read%20ProgramDb"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Read</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyword'>where</span>
<a name="line-130"></a>  <span class='hs-varid'>readsPrec</span> <span class='hs-varid'>p</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span>
<a name="line-131"></a>    <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-varid'>emptyProgramDb</span> <span class='hs-layout'>{</span> <span class='hs-varid'>configuredProgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>fromList</span> <span class='hs-varid'>s'</span> <span class='hs-layout'>}</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-132"></a>    <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>s'</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readsPrec</span> <span class='hs-varid'>p</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>]</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="instance%20Binary%20ProgramDb"></a><span class='hs-comment'>-- | Note that this instance does not preserve the known 'Program's.</span>
<a name="line-135"></a><a name="instance%20Binary%20ProgramDb"></a><span class='hs-comment'>-- See 'restoreProgramDb' for details.</span>
<a name="line-136"></a><a name="instance%20Binary%20ProgramDb"></a><span class='hs-comment'>--</span>
<a name="line-137"></a><a name="instance%20Binary%20ProgramDb"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Binary</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyword'>where</span>
<a name="line-138"></a>  <span class='hs-varid'>put</span> <span class='hs-varid'>db</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-139"></a>    <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>progSearchPath</span> <span class='hs-varid'>db</span><span class='hs-layout'>)</span>
<a name="line-140"></a>    <span class='hs-varid'>put</span> <span class='hs-layout'>(</span><span class='hs-varid'>configuredProgs</span> <span class='hs-varid'>db</span><span class='hs-layout'>)</span>
<a name="line-141"></a>
<a name="line-142"></a>  <span class='hs-varid'>get</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-143"></a>    <span class='hs-varid'>searchpath</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span>
<a name="line-144"></a>    <span class='hs-varid'>progs</span>      <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>get</span>
<a name="line-145"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>emptyProgramDb</span> <span class='hs-layout'>{</span>
<a name="line-146"></a>      <span class='hs-varid'>progSearchPath</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchpath</span><span class='hs-layout'>,</span>
<a name="line-147"></a>      <span class='hs-varid'>configuredProgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>progs</span>
<a name="line-148"></a>    <span class='hs-layout'>}</span>
<a name="line-149"></a>
<a name="line-150"></a>
<a name="line-151"></a><a name="restoreProgramDb"></a><span class='hs-comment'>-- | The 'Read'\/'Show' and 'Binary' instances do not preserve all the</span>
<a name="line-152"></a><span class='hs-comment'>-- unconfigured 'Programs' because 'Program' is not in 'Read'\/'Show' because</span>
<a name="line-153"></a><span class='hs-comment'>-- it contains functions. So to fully restore a deserialised 'ProgramDb' use</span>
<a name="line-154"></a><span class='hs-comment'>-- this function to add back all the known 'Program's.</span>
<a name="line-155"></a><span class='hs-comment'>--</span>
<a name="line-156"></a><span class='hs-comment'>-- * It does not add the default programs, but you probably want them, use</span>
<a name="line-157"></a><span class='hs-comment'>--   'builtinPrograms' in addition to any extra you might need.</span>
<a name="line-158"></a><span class='hs-comment'>--</span>
<a name="line-159"></a><span class='hs-definition'>restoreProgramDb</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Program</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-160"></a><span class='hs-definition'>restoreProgramDb</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addKnownPrograms</span>
<a name="line-161"></a>
<a name="line-162"></a>
<a name="line-163"></a><span class='hs-comment'>-- -------------------------------</span>
<a name="line-164"></a><span class='hs-comment'>-- Managing unconfigured programs</span>
<a name="line-165"></a>
<a name="line-166"></a><a name="addKnownProgram"></a><span class='hs-comment'>-- | Add a known program that we may configure later</span>
<a name="line-167"></a><span class='hs-comment'>--</span>
<a name="line-168"></a><span class='hs-definition'>addKnownProgram</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Program</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-169"></a><span class='hs-definition'>addKnownProgram</span> <span class='hs-varid'>prog</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateUnconfiguredProgs</span> <span class='hs-varop'>$</span>
<a name="line-170"></a>  <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>insertWith</span> <span class='hs-varid'>combine</span> <span class='hs-layout'>(</span><span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-171"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>combine</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-172"></a>
<a name="line-173"></a>
<a name="line-174"></a><a name="addKnownPrograms"></a><span class='hs-definition'>addKnownPrograms</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Program</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-175"></a><span class='hs-definition'>addKnownPrograms</span> <span class='hs-varid'>progs</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl'</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-varid'>addKnownProgram</span><span class='hs-layout'>)</span> <span class='hs-varid'>conf</span> <span class='hs-varid'>progs</span>
<a name="line-176"></a>
<a name="line-177"></a>
<a name="line-178"></a><a name="lookupKnownProgram"></a><span class='hs-definition'>lookupKnownProgram</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Program</span>
<a name="line-179"></a><span class='hs-definition'>lookupKnownProgram</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span>
<a name="line-180"></a>  <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-varid'>name</span> <span class='hs-varop'>.</span> <span class='hs-varid'>unconfiguredProgs</span>
<a name="line-181"></a>
<a name="line-182"></a>
<a name="line-183"></a><a name="knownPrograms"></a><span class='hs-definition'>knownPrograms</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Program</span><span class='hs-layout'>,</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ConfiguredProgram</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-184"></a><span class='hs-definition'>knownPrograms</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span>
<a name="line-185"></a>  <span class='hs-keyglyph'>[</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-layout'>,</span><span class='hs-varid'>p'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>p</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>elems</span> <span class='hs-layout'>(</span><span class='hs-varid'>unconfiguredProgs</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span>
<a name="line-186"></a>           <span class='hs-layout'>,</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>p'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-layout'>(</span><span class='hs-varid'>programName</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>configuredProgs</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="getProgramSearchPath"></a><span class='hs-comment'>-- | Get the current 'ProgramSearchPath' used by the 'ProgramDb'.</span>
<a name="line-189"></a><span class='hs-comment'>-- This is the default list of locations where programs are looked for when</span>
<a name="line-190"></a><span class='hs-comment'>-- configuring them. This can be overridden for specific programs (with</span>
<a name="line-191"></a><span class='hs-comment'>-- 'userSpecifyPath'), and specific known programs can modify or ignore this</span>
<a name="line-192"></a><span class='hs-comment'>-- search path in their own configuration code.</span>
<a name="line-193"></a><span class='hs-comment'>--</span>
<a name="line-194"></a><span class='hs-definition'>getProgramSearchPath</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramSearchPath</span>
<a name="line-195"></a><span class='hs-definition'>getProgramSearchPath</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>progSearchPath</span>
<a name="line-196"></a>
<a name="line-197"></a><a name="setProgramSearchPath"></a><span class='hs-comment'>-- | Change the current 'ProgramSearchPath' used by the 'ProgramDb'.</span>
<a name="line-198"></a><span class='hs-comment'>-- This will affect programs that are configured from here on, so you</span>
<a name="line-199"></a><span class='hs-comment'>-- should usually set it before configuring any programs.</span>
<a name="line-200"></a><span class='hs-comment'>--</span>
<a name="line-201"></a><span class='hs-definition'>setProgramSearchPath</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramSearchPath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-202"></a><span class='hs-definition'>setProgramSearchPath</span> <span class='hs-varid'>searchpath</span> <span class='hs-varid'>db</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>db</span> <span class='hs-layout'>{</span> <span class='hs-varid'>progSearchPath</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>searchpath</span> <span class='hs-layout'>}</span>
<a name="line-203"></a>
<a name="line-204"></a><a name="modifyProgramSearchPath"></a><span class='hs-comment'>-- | Modify the current 'ProgramSearchPath' used by the 'ProgramDb'.</span>
<a name="line-205"></a><span class='hs-comment'>-- This will affect programs that are configured from here on, so you</span>
<a name="line-206"></a><span class='hs-comment'>-- should usually modify it before configuring any programs.</span>
<a name="line-207"></a><span class='hs-comment'>--</span>
<a name="line-208"></a><span class='hs-definition'>modifyProgramSearchPath</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>ProgramSearchPath</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramSearchPath</span><span class='hs-layout'>)</span>
<a name="line-209"></a>                        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-210"></a>                        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-211"></a><span class='hs-definition'>modifyProgramSearchPath</span> <span class='hs-varid'>f</span> <span class='hs-varid'>db</span> <span class='hs-keyglyph'>=</span>
<a name="line-212"></a>  <span class='hs-varid'>setProgramSearchPath</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varop'>$</span> <span class='hs-varid'>getProgramSearchPath</span> <span class='hs-varid'>db</span><span class='hs-layout'>)</span> <span class='hs-varid'>db</span>
<a name="line-213"></a>
<a name="line-214"></a><a name="userSpecifyPath"></a><span class='hs-comment'>-- |User-specify this path.  Basically override any path information</span>
<a name="line-215"></a><span class='hs-comment'>-- for this program in the configuration. If it's not a known</span>
<a name="line-216"></a><span class='hs-comment'>-- program ignore it.</span>
<a name="line-217"></a><span class='hs-comment'>--</span>
<a name="line-218"></a><span class='hs-definition'>userSpecifyPath</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>   <span class='hs-comment'>-- ^Program name</span>
<a name="line-219"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span> <span class='hs-comment'>-- ^user-specified path to the program</span>
<a name="line-220"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-221"></a><span class='hs-definition'>userSpecifyPath</span> <span class='hs-varid'>name</span> <span class='hs-varid'>path</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateUnconfiguredProgs</span> <span class='hs-varop'>$</span>
<a name="line-222"></a>  <span class='hs-varid'>flip</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>update</span> <span class='hs-varid'>name</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-223"></a>
<a name="line-224"></a>
<a name="line-225"></a><a name="userMaybeSpecifyPath"></a><span class='hs-definition'>userMaybeSpecifyPath</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FilePath</span>
<a name="line-226"></a>                     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-227"></a><span class='hs-definition'>userMaybeSpecifyPath</span> <span class='hs-keyword'>_</span>    <span class='hs-conid'>Nothing</span> <span class='hs-varid'>conf</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>conf</span>
<a name="line-228"></a><span class='hs-definition'>userMaybeSpecifyPath</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>path</span><span class='hs-layout'>)</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>userSpecifyPath</span> <span class='hs-varid'>name</span> <span class='hs-varid'>path</span> <span class='hs-varid'>conf</span>
<a name="line-229"></a>
<a name="line-230"></a>
<a name="line-231"></a><a name="userSpecifyArgs"></a><span class='hs-comment'>-- |User-specify the arguments for this program.  Basically override</span>
<a name="line-232"></a><span class='hs-comment'>-- any args information for this program in the configuration. If it's</span>
<a name="line-233"></a><span class='hs-comment'>-- not a known program, ignore it..</span>
<a name="line-234"></a><span class='hs-definition'>userSpecifyArgs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span>    <span class='hs-comment'>-- ^Program name</span>
<a name="line-235"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ProgArg</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^user-specified args</span>
<a name="line-236"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-237"></a>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-238"></a><span class='hs-definition'>userSpecifyArgs</span> <span class='hs-varid'>name</span> <span class='hs-varid'>args'</span> <span class='hs-keyglyph'>=</span>
<a name="line-239"></a>    <span class='hs-varid'>updateUnconfiguredProgs</span>
<a name="line-240"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>update</span> <span class='hs-varid'>name</span> <span class='hs-varop'>$</span>
<a name="line-241"></a>         <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span> <span class='hs-varop'>++</span> <span class='hs-varid'>args'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-242"></a>  <span class='hs-varop'>.</span> <span class='hs-varid'>updateConfiguredProgs</span>
<a name="line-243"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>update</span> <span class='hs-varid'>name</span> <span class='hs-varop'>$</span>
<a name="line-244"></a>         <span class='hs-keyglyph'>\</span><span class='hs-varid'>prog</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>prog</span> <span class='hs-layout'>{</span> <span class='hs-varid'>programOverrideArgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>programOverrideArgs</span> <span class='hs-varid'>prog</span>
<a name="line-245"></a>                                                 <span class='hs-varop'>++</span> <span class='hs-varid'>args'</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-246"></a>
<a name="line-247"></a>
<a name="line-248"></a><a name="userSpecifyPaths"></a><span class='hs-comment'>-- | Like 'userSpecifyPath' but for a list of progs and their paths.</span>
<a name="line-249"></a><span class='hs-comment'>--</span>
<a name="line-250"></a><span class='hs-definition'>userSpecifyPaths</span> <span class='hs-keyglyph'>::</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'>FilePath</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-251"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-252"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-253"></a><span class='hs-definition'>userSpecifyPaths</span> <span class='hs-varid'>paths</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span>
<a name="line-254"></a>  <span class='hs-varid'>foldl'</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>conf'</span> <span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-varid'>path</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>userSpecifyPath</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>path</span> <span class='hs-varid'>conf'</span><span class='hs-layout'>)</span> <span class='hs-varid'>conf</span> <span class='hs-varid'>paths</span>
<a name="line-255"></a>
<a name="line-256"></a>
<a name="line-257"></a><a name="userSpecifyArgss"></a><span class='hs-comment'>-- | Like 'userSpecifyPath' but for a list of progs and their args.</span>
<a name="line-258"></a><span class='hs-comment'>--</span>
<a name="line-259"></a><span class='hs-definition'>userSpecifyArgss</span> <span class='hs-keyglyph'>::</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-keyglyph'>[</span><span class='hs-conid'>ProgArg</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-260"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-261"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-262"></a><span class='hs-definition'>userSpecifyArgss</span> <span class='hs-varid'>argss</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span>
<a name="line-263"></a>  <span class='hs-varid'>foldl'</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>conf'</span> <span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>userSpecifyArgs</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>args</span> <span class='hs-varid'>conf'</span><span class='hs-layout'>)</span> <span class='hs-varid'>conf</span> <span class='hs-varid'>argss</span>
<a name="line-264"></a>
<a name="line-265"></a>
<a name="line-266"></a><a name="userSpecifiedPath"></a><span class='hs-comment'>-- | Get the path that has been previously specified for a program, if any.</span>
<a name="line-267"></a><span class='hs-comment'>--</span>
<a name="line-268"></a><span class='hs-definition'>userSpecifiedPath</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Program</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FilePath</span>
<a name="line-269"></a><span class='hs-definition'>userSpecifiedPath</span> <span class='hs-varid'>prog</span> <span class='hs-keyglyph'>=</span>
<a name="line-270"></a>  <span class='hs-varid'>join</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-varid'>p</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-varid'>p</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-layout'>(</span><span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>unconfiguredProgs</span>
<a name="line-271"></a>
<a name="line-272"></a>
<a name="line-273"></a><a name="userSpecifiedArgs"></a><span class='hs-comment'>-- | Get any extra args that have been previously specified for a program.</span>
<a name="line-274"></a><span class='hs-comment'>--</span>
<a name="line-275"></a><span class='hs-definition'>userSpecifiedArgs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Program</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ProgArg</span><span class='hs-keyglyph'>]</span>
<a name="line-276"></a><span class='hs-definition'>userSpecifiedArgs</span> <span class='hs-varid'>prog</span> <span class='hs-keyglyph'>=</span>
<a name="line-277"></a>  <span class='hs-varid'>maybe</span> <span class='hs-conid'>[]</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>as</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>-&gt;</span><span class='hs-keyword'>as</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-layout'>(</span><span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>unconfiguredProgs</span>
<a name="line-278"></a>
<a name="line-279"></a>
<a name="line-280"></a><span class='hs-comment'>-- -----------------------------</span>
<a name="line-281"></a><span class='hs-comment'>-- Managing configured programs</span>
<a name="line-282"></a>
<a name="line-283"></a><a name="lookupProgram"></a><span class='hs-comment'>-- | Try to find a configured program</span>
<a name="line-284"></a><span class='hs-definition'>lookupProgram</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Program</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ConfiguredProgram</span>
<a name="line-285"></a><span class='hs-definition'>lookupProgram</span> <span class='hs-varid'>prog</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>lookup</span> <span class='hs-layout'>(</span><span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>configuredProgs</span>
<a name="line-286"></a>
<a name="line-287"></a>
<a name="line-288"></a><a name="updateProgram"></a><span class='hs-comment'>-- | Update a configured program in the database.</span>
<a name="line-289"></a><span class='hs-definition'>updateProgram</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ConfiguredProgram</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-290"></a>                                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-291"></a><span class='hs-definition'>updateProgram</span> <span class='hs-varid'>prog</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>updateConfiguredProgs</span> <span class='hs-varop'>$</span>
<a name="line-292"></a>  <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>insert</span> <span class='hs-layout'>(</span><span class='hs-varid'>programId</span> <span class='hs-varid'>prog</span><span class='hs-layout'>)</span> <span class='hs-varid'>prog</span>
<a name="line-293"></a>
<a name="line-294"></a>
<a name="line-295"></a><a name="configuredPrograms"></a><span class='hs-comment'>-- | List all configured programs.</span>
<a name="line-296"></a><span class='hs-definition'>configuredPrograms</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ProgramDb</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ConfiguredProgram</span><span class='hs-keyglyph'>]</span>
<a name="line-297"></a><span class='hs-definition'>configuredPrograms</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>elems</span> <span class='hs-varop'>.</span> <span class='hs-varid'>configuredProgs</span>
<a name="line-298"></a>
<a name="line-299"></a><span class='hs-comment'>-- ---------------------------</span>
<a name="line-300"></a><span class='hs-comment'>-- Configuring known programs</span>
<a name="line-301"></a>
<a name="line-302"></a><a name="configureProgram"></a><span class='hs-comment'>-- | Try to configure a specific program. If the program is already included in</span>
<a name="line-303"></a><span class='hs-comment'>-- the collection of unconfigured programs then we use any user-supplied</span>
<a name="line-304"></a><span class='hs-comment'>-- location and arguments. If the program gets configured successfully it gets</span>
<a name="line-305"></a><span class='hs-comment'>-- added to the configured collection.</span>
<a name="line-306"></a><span class='hs-comment'>--</span>
<a name="line-307"></a><span class='hs-comment'>-- Note that it is not a failure if the program cannot be configured. It's only</span>
<a name="line-308"></a><span class='hs-comment'>-- a failure if the user supplied a location and the program could not be found</span>
<a name="line-309"></a><span class='hs-comment'>-- at that location.</span>
<a name="line-310"></a><span class='hs-comment'>--</span>
<a name="line-311"></a><span class='hs-comment'>-- The reason for it not being a failure at this stage is that we don't know up</span>
<a name="line-312"></a><span class='hs-comment'>-- front all the programs we will need, so we try to configure them all.</span>
<a name="line-313"></a><span class='hs-comment'>-- To verify that a program was actually successfully configured use</span>
<a name="line-314"></a><span class='hs-comment'>-- 'requireProgram'.</span>
<a name="line-315"></a><span class='hs-comment'>--</span>
<a name="line-316"></a><span class='hs-definition'>configureProgram</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Verbosity</span>
<a name="line-317"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Program</span>
<a name="line-318"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-319"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-320"></a><span class='hs-definition'>configureProgram</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-321"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span>
<a name="line-322"></a>  <span class='hs-varid'>maybeLocation</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>userSpecifiedPath</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>conf</span> <span class='hs-keyword'>of</span>
<a name="line-323"></a>    <span class='hs-conid'>Nothing</span>   <span class='hs-keyglyph'>-&gt;</span>
<a name="line-324"></a>      <span class='hs-varid'>programFindLocation</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>verbosity</span> <span class='hs-layout'>(</span><span class='hs-varid'>progSearchPath</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span>
<a name="line-325"></a>      <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>swap</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fmap</span> <span class='hs-conid'>FoundOnSystem</span> <span class='hs-varop'>.</span> <span class='hs-varid'>swap</span><span class='hs-layout'>)</span>
<a name="line-326"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>path</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-327"></a>      <span class='hs-varid'>absolute</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>doesExecutableExist</span> <span class='hs-varid'>path</span>
<a name="line-328"></a>      <span class='hs-keyword'>if</span> <span class='hs-varid'>absolute</span>
<a name="line-329"></a>        <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>UserSpecified</span> <span class='hs-varid'>path</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-330"></a>        <span class='hs-keyword'>else</span> <span class='hs-varid'>findProgramOnSearchPath</span> <span class='hs-varid'>verbosity</span> <span class='hs-layout'>(</span><span class='hs-varid'>progSearchPath</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span> <span class='hs-varid'>path</span>
<a name="line-331"></a>             <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>die</span> <span class='hs-varid'>notFound</span><span class='hs-layout'>)</span>
<a name="line-332"></a>                       <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>.</span> <span class='hs-varid'>swap</span> <span class='hs-varop'>.</span> <span class='hs-varid'>fmap</span> <span class='hs-conid'>UserSpecified</span> <span class='hs-varop'>.</span> <span class='hs-varid'>swap</span><span class='hs-layout'>)</span>
<a name="line-333"></a>      <span class='hs-keyword'>where</span> <span class='hs-varid'>notFound</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"Cannot find the program '"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>name</span>
<a name="line-334"></a>                     <span class='hs-varop'>++</span> <span class='hs-str'>"'. User-specified path '"</span>
<a name="line-335"></a>                     <span class='hs-varop'>++</span> <span class='hs-varid'>path</span> <span class='hs-varop'>++</span> <span class='hs-str'>"' does not refer to an executable and "</span>
<a name="line-336"></a>                     <span class='hs-varop'>++</span> <span class='hs-str'>"the program is not on the system path."</span>
<a name="line-337"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>maybeLocation</span> <span class='hs-keyword'>of</span>
<a name="line-338"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>conf</span>
<a name="line-339"></a>    <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>location</span><span class='hs-layout'>,</span> <span class='hs-varid'>triedLocations</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-340"></a>      <span class='hs-varid'>version</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>programFindVersion</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>verbosity</span> <span class='hs-layout'>(</span><span class='hs-varid'>locationPath</span> <span class='hs-varid'>location</span><span class='hs-layout'>)</span>
<a name="line-341"></a>      <span class='hs-varid'>newPath</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>programSearchPathAsPATHVar</span> <span class='hs-layout'>(</span><span class='hs-varid'>progSearchPath</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span>
<a name="line-342"></a>      <span class='hs-keyword'>let</span> <span class='hs-varid'>configuredProg</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ConfiguredProgram</span> <span class='hs-layout'>{</span>
<a name="line-343"></a>            <span class='hs-varid'>programId</span>           <span class='hs-keyglyph'>=</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span>
<a name="line-344"></a>            <span class='hs-varid'>programVersion</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>version</span><span class='hs-layout'>,</span>
<a name="line-345"></a>            <span class='hs-varid'>programDefaultArgs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-346"></a>            <span class='hs-varid'>programOverrideArgs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>userSpecifiedArgs</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>conf</span><span class='hs-layout'>,</span>
<a name="line-347"></a>            <span class='hs-varid'>programOverrideEnv</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-str'>"PATH"</span><span class='hs-layout'>,</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>newPath</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-348"></a>            <span class='hs-varid'>programProperties</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>empty</span><span class='hs-layout'>,</span>
<a name="line-349"></a>            <span class='hs-varid'>programLocation</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>location</span><span class='hs-layout'>,</span>
<a name="line-350"></a>            <span class='hs-varid'>programMonitorFiles</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>triedLocations</span>
<a name="line-351"></a>          <span class='hs-layout'>}</span>
<a name="line-352"></a>      <span class='hs-varid'>configuredProg'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>programPostConf</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>configuredProg</span>
<a name="line-353"></a>      <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>updateConfiguredProgs</span> <span class='hs-layout'>(</span><span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>insert</span> <span class='hs-varid'>name</span> <span class='hs-varid'>configuredProg'</span><span class='hs-layout'>)</span> <span class='hs-varid'>conf</span><span class='hs-layout'>)</span>
<a name="line-354"></a>
<a name="line-355"></a>
<a name="line-356"></a><a name="configurePrograms"></a><span class='hs-comment'>-- | Configure a bunch of programs using 'configureProgram'. Just a 'foldM'.</span>
<a name="line-357"></a><span class='hs-comment'>--</span>
<a name="line-358"></a><span class='hs-definition'>configurePrograms</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Verbosity</span>
<a name="line-359"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Program</span><span class='hs-keyglyph'>]</span>
<a name="line-360"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-361"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-362"></a><span class='hs-definition'>configurePrograms</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>progs</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span>
<a name="line-363"></a>  <span class='hs-varid'>foldM</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-layout'>(</span><span class='hs-varid'>configureProgram</span> <span class='hs-varid'>verbosity</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>conf</span> <span class='hs-varid'>progs</span>
<a name="line-364"></a>
<a name="line-365"></a>
<a name="line-366"></a><a name="configureAllKnownPrograms"></a><span class='hs-comment'>-- | Try to configure all the known programs that have not yet been configured.</span>
<a name="line-367"></a><span class='hs-comment'>--</span>
<a name="line-368"></a><span class='hs-definition'>configureAllKnownPrograms</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Verbosity</span>
<a name="line-369"></a>                          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-370"></a>                          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-371"></a><span class='hs-definition'>configureAllKnownPrograms</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span>
<a name="line-372"></a>  <span class='hs-varid'>configurePrograms</span> <span class='hs-varid'>verbosity</span>
<a name="line-373"></a>    <span class='hs-keyglyph'>[</span> <span class='hs-varid'>prog</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>prog</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>elems</span> <span class='hs-varid'>notYetConfigured</span> <span class='hs-keyglyph'>]</span> <span class='hs-varid'>conf</span>
<a name="line-374"></a>  <span class='hs-keyword'>where</span>
<a name="line-375"></a>    <span class='hs-varid'>notYetConfigured</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unconfiguredProgs</span> <span class='hs-varid'>conf</span>
<a name="line-376"></a>      <span class='hs-varop'>`</span><span class='hs-conid'>Map</span><span class='hs-varop'>.</span><span class='hs-varid'>difference</span><span class='hs-varop'>`</span> <span class='hs-varid'>configuredProgs</span> <span class='hs-varid'>conf</span>
<a name="line-377"></a>
<a name="line-378"></a>
<a name="line-379"></a><a name="reconfigurePrograms"></a><span class='hs-comment'>-- | reconfigure a bunch of programs given new user-specified args. It takes</span>
<a name="line-380"></a><span class='hs-comment'>-- the same inputs as 'userSpecifyPath' and 'userSpecifyArgs' and for all progs</span>
<a name="line-381"></a><span class='hs-comment'>-- with a new path it calls 'configureProgram'.</span>
<a name="line-382"></a><span class='hs-comment'>--</span>
<a name="line-383"></a><span class='hs-definition'>reconfigurePrograms</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Verbosity</span>
<a name="line-384"></a>                    <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'>FilePath</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-385"></a>                    <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-keyglyph'>[</span><span class='hs-conid'>ProgArg</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-386"></a>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-387"></a>                    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-388"></a><span class='hs-definition'>reconfigurePrograms</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>paths</span> <span class='hs-varid'>argss</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-389"></a>  <span class='hs-varid'>configurePrograms</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>progs</span>
<a name="line-390"></a>   <span class='hs-varop'>.</span> <span class='hs-varid'>userSpecifyPaths</span> <span class='hs-varid'>paths</span>
<a name="line-391"></a>   <span class='hs-varop'>.</span> <span class='hs-varid'>userSpecifyArgss</span> <span class='hs-varid'>argss</span>
<a name="line-392"></a>   <span class='hs-varop'>$</span> <span class='hs-varid'>conf</span>
<a name="line-393"></a>
<a name="line-394"></a>  <span class='hs-keyword'>where</span>
<a name="line-395"></a>    <span class='hs-varid'>progs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>catMaybes</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>lookupKnownProgram</span> <span class='hs-varid'>name</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span><span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>paths</span> <span class='hs-keyglyph'>]</span>
<a name="line-396"></a>
<a name="line-397"></a>
<a name="line-398"></a><a name="requireProgram"></a><span class='hs-comment'>-- | Check that a program is configured and available to be run.</span>
<a name="line-399"></a><span class='hs-comment'>--</span>
<a name="line-400"></a><span class='hs-comment'>-- It raises an exception if the program could not be configured, otherwise</span>
<a name="line-401"></a><span class='hs-comment'>-- it returns the configured program.</span>
<a name="line-402"></a><span class='hs-comment'>--</span>
<a name="line-403"></a><span class='hs-definition'>requireProgram</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Verbosity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Program</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-404"></a>               <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConfiguredProgram</span><span class='hs-layout'>,</span> <span class='hs-conid'>ProgramDb</span><span class='hs-layout'>)</span>
<a name="line-405"></a><span class='hs-definition'>requireProgram</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>conf</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-406"></a>
<a name="line-407"></a>  <span class='hs-comment'>-- If it's not already been configured, try to configure it now</span>
<a name="line-408"></a>  <span class='hs-varid'>conf'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupProgram</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>conf</span> <span class='hs-keyword'>of</span>
<a name="line-409"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>configureProgram</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>conf</span>
<a name="line-410"></a>    <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>conf</span>
<a name="line-411"></a>
<a name="line-412"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupProgram</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>conf'</span> <span class='hs-keyword'>of</span>
<a name="line-413"></a>    <span class='hs-conid'>Nothing</span>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>die</span> <span class='hs-varid'>notFound</span>
<a name="line-414"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>configuredProg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>configuredProg</span><span class='hs-layout'>,</span> <span class='hs-varid'>conf'</span><span class='hs-layout'>)</span>
<a name="line-415"></a>
<a name="line-416"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>notFound</span>       <span class='hs-keyglyph'>=</span> <span class='hs-str'>"The program '"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span>
<a name="line-417"></a>                      <span class='hs-varop'>++</span> <span class='hs-str'>"' is required but it could not be found."</span>
<a name="line-418"></a>
<a name="line-419"></a>
<a name="line-420"></a><a name="lookupProgramVersion"></a><span class='hs-comment'>-- | Check that a program is configured and available to be run.</span>
<a name="line-421"></a><span class='hs-comment'>--</span>
<a name="line-422"></a><span class='hs-comment'>-- Additionally check that the program version number is suitable and return</span>
<a name="line-423"></a><span class='hs-comment'>-- it. For example you could require 'AnyVersion' or @'orLaterVersion'</span>
<a name="line-424"></a><span class='hs-comment'>-- ('Version' [1,0] [])@</span>
<a name="line-425"></a><span class='hs-comment'>--</span>
<a name="line-426"></a><span class='hs-comment'>-- It returns the configured program, its version number and a possibly updated</span>
<a name="line-427"></a><span class='hs-comment'>-- 'ProgramDb'. If the program could not be configured or the version is</span>
<a name="line-428"></a><span class='hs-comment'>-- unsuitable, it returns an error value.</span>
<a name="line-429"></a><span class='hs-comment'>--</span>
<a name="line-430"></a><span class='hs-definition'>lookupProgramVersion</span>
<a name="line-431"></a>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Verbosity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Program</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VersionRange</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-432"></a>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConfiguredProgram</span><span class='hs-layout'>,</span> <span class='hs-conid'>Version</span><span class='hs-layout'>,</span> <span class='hs-conid'>ProgramDb</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-433"></a><span class='hs-definition'>lookupProgramVersion</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>range</span> <span class='hs-varid'>programDb</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-434"></a>
<a name="line-435"></a>  <span class='hs-comment'>-- If it's not already been configured, try to configure it now</span>
<a name="line-436"></a>  <span class='hs-varid'>programDb'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupProgram</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>programDb</span> <span class='hs-keyword'>of</span>
<a name="line-437"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>configureProgram</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>programDb</span>
<a name="line-438"></a>    <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>programDb</span>
<a name="line-439"></a>
<a name="line-440"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupProgram</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>programDb'</span> <span class='hs-keyword'>of</span>
<a name="line-441"></a>    <span class='hs-conid'>Nothing</span>                           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Left</span> <span class='hs-varid'>notFound</span>
<a name="line-442"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>configuredProg</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>ConfiguredProgram</span> <span class='hs-layout'>{</span> <span class='hs-varid'>programLocation</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>location</span> <span class='hs-layout'>}</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-443"></a>      <span class='hs-keyword'>case</span> <span class='hs-varid'>programVersion</span> <span class='hs-varid'>configuredProg</span> <span class='hs-keyword'>of</span>
<a name="line-444"></a>        <span class='hs-conid'>Just</span> <span class='hs-varid'>version</span>
<a name="line-445"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>withinRange</span> <span class='hs-varid'>version</span> <span class='hs-varid'>range</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-446"></a>            <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>configuredProg</span><span class='hs-layout'>,</span> <span class='hs-varid'>version</span> <span class='hs-layout'>,</span><span class='hs-varid'>programDb'</span><span class='hs-layout'>)</span>
<a name="line-447"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>                 <span class='hs-keyglyph'>-&gt;</span>
<a name="line-448"></a>            <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-varid'>badVersion</span> <span class='hs-varid'>version</span> <span class='hs-varid'>location</span><span class='hs-layout'>)</span>
<a name="line-449"></a>        <span class='hs-conid'>Nothing</span>                       <span class='hs-keyglyph'>-&gt;</span>
<a name="line-450"></a>          <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>Left</span> <span class='hs-layout'>(</span><span class='hs-varid'>unknownVersion</span> <span class='hs-varid'>location</span><span class='hs-layout'>)</span>
<a name="line-451"></a>
<a name="line-452"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>notFound</span>       <span class='hs-keyglyph'>=</span> <span class='hs-str'>"The program '"</span>
<a name="line-453"></a>                      <span class='hs-varop'>++</span> <span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span> <span class='hs-varop'>++</span> <span class='hs-str'>"'"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>versionRequirement</span>
<a name="line-454"></a>                      <span class='hs-varop'>++</span> <span class='hs-str'>" is required but it could not be found."</span>
<a name="line-455"></a>        <span class='hs-varid'>badVersion</span> <span class='hs-varid'>v</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"The program '"</span>
<a name="line-456"></a>                      <span class='hs-varop'>++</span> <span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span> <span class='hs-varop'>++</span> <span class='hs-str'>"'"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>versionRequirement</span>
<a name="line-457"></a>                      <span class='hs-varop'>++</span> <span class='hs-str'>" is required but the version found at "</span>
<a name="line-458"></a>                      <span class='hs-varop'>++</span> <span class='hs-varid'>locationPath</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-str'>" is version "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>display</span> <span class='hs-varid'>v</span>
<a name="line-459"></a>        <span class='hs-varid'>unknownVersion</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"The program '"</span>
<a name="line-460"></a>                      <span class='hs-varop'>++</span> <span class='hs-varid'>programName</span> <span class='hs-varid'>prog</span> <span class='hs-varop'>++</span> <span class='hs-str'>"'"</span> <span class='hs-varop'>++</span> <span class='hs-varid'>versionRequirement</span>
<a name="line-461"></a>                      <span class='hs-varop'>++</span> <span class='hs-str'>" is required but the version of "</span>
<a name="line-462"></a>                      <span class='hs-varop'>++</span> <span class='hs-varid'>locationPath</span> <span class='hs-varid'>l</span> <span class='hs-varop'>++</span> <span class='hs-str'>" could not be determined."</span>
<a name="line-463"></a>        <span class='hs-varid'>versionRequirement</span>
<a name="line-464"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isAnyVersion</span> <span class='hs-varid'>range</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>""</span>
<a name="line-465"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-str'>" version "</span> <span class='hs-varop'>++</span> <span class='hs-varid'>display</span> <span class='hs-varid'>range</span>
<a name="line-466"></a>
<a name="line-467"></a><a name="requireProgramVersion"></a><span class='hs-comment'>-- | Like 'lookupProgramVersion', but raises an exception in case of error</span>
<a name="line-468"></a><span class='hs-comment'>-- instead of returning 'Left errMsg'.</span>
<a name="line-469"></a><span class='hs-comment'>--</span>
<a name="line-470"></a><span class='hs-definition'>requireProgramVersion</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Verbosity</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Program</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VersionRange</span>
<a name="line-471"></a>                      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ProgramDb</span>
<a name="line-472"></a>                      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConfiguredProgram</span><span class='hs-layout'>,</span> <span class='hs-conid'>Version</span><span class='hs-layout'>,</span> <span class='hs-conid'>ProgramDb</span><span class='hs-layout'>)</span>
<a name="line-473"></a><span class='hs-definition'>requireProgramVersion</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>range</span> <span class='hs-varid'>programDb</span> <span class='hs-keyglyph'>=</span>
<a name="line-474"></a>  <span class='hs-varid'>join</span> <span class='hs-varop'>$</span> <span class='hs-varid'>either</span> <span class='hs-varid'>die</span> <span class='hs-varid'>return</span> <span class='hs-varop'>`fmap`</span>
<a name="line-475"></a>  <span class='hs-varid'>lookupProgramVersion</span> <span class='hs-varid'>verbosity</span> <span class='hs-varid'>prog</span> <span class='hs-varid'>range</span> <span class='hs-varid'>programDb</span>
</pre></body>
</html>