A9     @The length of the input string must be 32. This is not checked. F(Elements in the list that appear only once, groups of elements which  appear more than once.) < nubSplitBy (==) [1,2,3,1,4,5,2] == ([3,4,5],[[1,1],[2,2]]) Like =, but makes groups from the whole list, not only consecutive  elements. Essentially 'f -> groupBy f . sort' but doesn't need an Ord  instance. ; fullGroupBy (==) [1,2,3,1,4,5] == [[1,1],[2],[3],[4],[5]] ? fullGroupBy (==) "mississippi" == ["m", "iiii", "ssss", "pp"] Returns  for single-element lists and  for all others. ;Replaces one list with another as many times as requested. G maxReplaceList 3 "ab" "--" "|abc1abc2abc3abc|" == "|--c1--c2--c3abc|" ?Performs one replacement of the first sublist with the second. 4 replaceListOnce "abc" "-" "abcdefabc" == "-defabc" Like $, but replaces throughout the list. 1 replaceList "abc" "--" "abcdefabc" == "--def--"  Like  Prelude.read , but gives Nothing on failure or ambiguity. ! ! !"#$%&'()*+,-./0123456789:;<=>?@A convenience. AB"#$%&'()*,./012345678;<@"%$##$%&*)(''()*, ./0123456./012345678;<@CDEFGHIJKLMNOPQRSTUVWXYZ[\] CFGHJKLMNV CFFGHJKLMNV ^_5An Task represents the process of building a target. `a-The name of the Rule where the Task is from. bDAny command line arguments which the build action may use. Archived 8 in the database so that changed args incite a rebuild. BTODO: support more than just Strings, arbitrary OptDescr would be  nice. cEThe target(s) which the Task will build. If there are more than one, 2 they are all built by the action simultaneously. d@The dependencies which must be satisfied before the Task can be  performed. e?The action, which builds the target on the assumption that the # dependencies have been satisfied. f Tasks can't be Show since the tAction can'"t be output meaningfully. This is  the next-best thing. ghijCRemoves dependencies which cannot be satisfied --- that is to say, L dependencies that do not exist and are not targeted. The second element of 7 the tuple returned contains the removed dependencies. kIReturns a (graph of tasks, cycles) pair. All cycles are removed from the  graph. lEFor each Task, finds all those which target any of its dependencies. mJfst of each resulting element is the index of the dependency in the pairs L |snd of each resulting element is the index of the target in the pairs ^_`abcdefgjk^_`abcde`abcdefgjk nopqrstuvwxyz{|}~tt FReturns a (targets to be built, up to date targets, database) triple. IThe database is updated here, because we may need to hash here to decide M whether something needs to be built. Thus if we would not do updating here, - we would need to rehash something later on. It'0s possible that some tasks are removed from the ' to be run' list later, N but Datums for them are generated here anyway. Such should be removed by the  caller to keep the DB slim.  Coadjute is the main monad you'"ll be working in. You can use the  M family of functions to add rules whilst within this monad, and you can have 1 a look at what arguments were given to you with . For your convenience, a A instance is provided. You should use this instead of System.Environment.getArgs , to let 7 Coadjute handle its own command line arguments first. *A rule for building targets individually. .A rule for building multiple targets at once.   rule' = flip rule []   ruleM' = flip ruleM []               !"#$%&'()*()+,-./0123456789:;<==>?@ABCDEFGHIJKLMNOPQRSTUVWWXYZ[[\]^_`abcdefghijklmno p q q r s t u v w x y z { | } ~             Coadjute-0.1.1CoadjuteCoadjute.Util.Monad Coadjute.HashCoadjute.Util.FileCoadjute.Util.ListCoadjute.Util.MiscCoadjute.CoData Coadjute.DB Coadjute.TaskCoadjute.Task.PerformCoadjute.Task.Required Coadjute.Rule Coadjute.MainTargetSource getUserArgsruleruleMrule'ruleM'coadjuteanyMallMwhenMwhileMuntilMHashhashFileshowHashreadHash doesPathExist allPathsExisttoAbsolutePath nubSplitBy fullGroupBybase Data.ListgroupBylength1ghc-primGHC.BoolTrueFalsemaxReplaceListreplaceListOnce replaceListpartitionEithers eitherToMaybemreadplural ParallelOpt ProcessorUncappedCapped Verbosity VeryVerboseVerboseNormalQuiet OptionData CoadjuteDatacoArgs coUserArgs coVerbosity coDBExists coForceDB coForceNoDB coForceNoHash coParallel coParallelOptCoData dbFileName versionString getHelpString runCoData coUsingDBoptDescisHelp handleNonOptiotransformers-0.2.2.0Control.Monad.IO.ClassMonadIO mtl-2.0.1.0Control.Monad.Reader.ClassasksDBdbData hasHashesMDBDatumdArgshasHashaddEntrydbLookup loadDataBase dbVerStringparseDBcheckFirstLinecsvToDBscanLine fromCSVFieldunquote writeDataBaseputDBdbToCSV datToTuple tupleToRecord toCSVField mustBeQuotedquote TaskGraphTasktNametArgstTargetstDepstActionshowTask sameTarget=~=!~=splitImpossibles splitCyclestoPairstoEdges VisitedArray ManagerChanMessageDone ErrorMessage KeepGoing performTasks targetString printMessage performTaskrootslinearPerformTasksparallelPerformTasksmanageforkwaitFortraverse CheckDepFuncsplitUnnecessaryneedsBuildingWithoutDBneedsBuildingByExistenceneedsBuildingByTimeStampgetOldestModTimeneedsBuildingWithDBselectCheckDepFuncuseHash useTimeStamp checkNewness argsMatchCounCoRuleListRLRulerNamerTasksaddRule runCoadjute putTaskGroupsputTasks putTasks'