hF:      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLM N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~   Safe-Inferred Safe-Inferred3Show a number to a fixed number of decimal places.  showDP 4 pi == "3.1416"  showDP 0 pi == "3"  showDP 2 3 == "3.00" ;Specialised numeric conversion, type restricted version of . ;Specialised numeric conversion, type restricted version of . ;Specialised numeric conversion, type restricted version of . ;Specialised numeric conversion, type restricted version of . None .A type alias for seconds, which are stored as . Sleep for a number of seconds. 5 fmap (round . fst) (duration $ sleep 1) == return 1 7Calculate the difference between two times in seconds. ? Usually the first time will be the end of an event, and the & second time will be the beginning. ( \a b -> a > b ==> subtractTime a b > 0 JShow a number of seconds, typically a duration, in a suitable manner with % responable precision for a human. ! showDuration 3.435 == "3.44s" " showDuration 623.8 == "10m24s" " showDuration 62003.8 == "17h13m" % showDuration 1e8 == "27777h47m" QCall once to start, then call repeatedly to get the elapsed time since the first J call. Values will usually increase, unless the system clock is updated # (if you need the guarantee, see ). Like C, but results will never decrease (though they may stay the same). K do f <- offsetTimeIncrease; xs <- replicateM 10 f; return $ xs == sort xs 'Record how long a computation takes in  .      Safe-Inferred &Update the first component of a pair. % first succ (1,"test") == (2,"test") 'Update the second component of a pair. ) second reverse (1,"test") == (1,"tset") MGiven two functions, apply one to the first component and one to the second.  A specialised version of . - (succ *** reverse) (1,"test") == (2,"tset") EGiven two functions, apply both to a single argument to form a pair.  A specialised version of .  (succ &&& pred) 1 == (2,0) &Duplicate a single value into a pair.  dupe 12 == (12, 12) 7Apply a single function to both componenets of a pair.  both succ (1,2) == (2,3)  Extract the  of a triple.  Extract the  of a triple. 'Extract the final element of a triple.    Safe-Inferred(@Apply some operation repeatedly, producing an element of output " and the remainder of the list. 4 \xs -> repeatedly (splitAt 3) xs == chunksOf 3 xs / \xs -> repeatedly word1 (trim xs) == words xs Flipped version of .  for [1,2,3] (+1) == [2,3,4] 4Are two lists disjoint, with no elements in common.  disjoint [1,2,3] [4,5] == True ! disjoint [1,2,3] [4,1] == False 2Is there any element which occurs more than once.  anySame [1,1,2] == True  anySame [1,2,3] == False # anySame (1:2:1:undefined) == True  anySame [] == False 4 \xs -> anySame xs == (length (nub xs) < length xs) !Are all elements the same.  allSame [1,1,2] == False  allSame [1,1,1] == True  allSame [1] == True  allSame [] == True $ allSame (1:1:2:undefined) == False - \xs -> allSame xs == (length (nub xs) <= 1) "*Non-recursive transform over a list, like . % list 1 (\v _ -> v - 2) [5,6,7] == 3 % list 1 (\v _ -> v - 2) [] == 1 J \nil cons xs -> maybe nil (uncurry cons) (uncons xs) == list nil cons xs #If the list is empty returns , otherwise returns the  and the . # uncons "test" == Just ('t',"est")  uncons "" == Nothing J \xs -> uncons xs == if null xs then Nothing else Just (head xs, tail xs) $If the list is empty returns , otherwise returns the  and the . # unsnoc "test" == Just ("tes",'t')  unsnoc "" == Nothing J \xs -> unsnoc xs == if null xs then Nothing else Just (init xs, last xs) %7Append an element to the start of a list, an alias for '(:)'.  cons 't' "est" == "test" , \x xs -> uncons (cons x xs) == Just (x,xs) &.Append an element to the end of a list, takes O(n) time.  snoc "tes" 't' == "test" , \xs x -> unsnoc (snoc xs x) == Just (xs,x) '4Take a number of elements from the end of the list.  takeEnd 3 "hello" == "llo"  takeEnd 5 "bye" == "bye"  takeEnd (-1) "bye" == "" ' \i xs -> takeEnd i xs `isSuffixOf` xs = \i xs -> length (takeEnd i xs) == min (max 0 i) (length xs) (4Drop a number of elements from the end of the list.  dropEnd 3 "hello" == "he"  dropEnd 5 "bye" == ""  dropEnd (-1) "bye" == "bye" ' \i xs -> dropEnd i xs `isPrefixOf` xs ? \i xs -> length (dropEnd i xs) == max 0 (length xs - max 0 i) 0 \i -> take 3 (dropEnd 5 [i..]) == take 3 [i..] ) A merging of  and . 6 concatUnzip [("a","AB"),("bc","C")] == ("abc","ABC") * A merging of  and . F concatUnzip3 [("a","AB",""),("bc","C","123")] == ("abc","ABC","123") + A version of  operating from the end. & takeWhileEnd even [2,3,4,6] == [4,6] ,.Remove spaces from the start of a string, see .. -,Remove spaces from the end of a string, see .. .=Remove spaces from either side of a string. A combination of - and ,. # trim " hello " == "hello" & trimStart " hello " == "hello " % trimEnd " hello " == " hello" ' \s -> trim s == trimEnd (trimStart s) / Convert a string to lower case. , lower "This is A TEST" == "this is a test"  lower "" == "" 0 Convert a string to upper case. , upper "This is A TEST" == "THIS IS A TEST"  upper "" == "" 2 A version of 7 where the comparison is done on some extracted value. A sortOn fst [(3,"z"),(1,""),(3,"a")] == [(1,""),(3,"z"),(3,"a")] 3 A version of 5 where the equality is done on some extracted value. 4 A version of 5 where the equality is done on some extracted value. 5A combination of  and . K groupSort [(1,'t'),(3,'t'),(2,'e'),(2,'s')] == [(1,"t"),(2,"es"),(3,"t")] : \xs -> map fst (groupSort xs) == sort (nub (map fst xs)) @ \xs -> concatMap snd (groupSort xs) == map snd (sortOn fst xs) 61Merge two lists which are assumed to be ordered.  merge "ace" "bd" == "abcde" 8 \xs ys -> merge (sort xs) (sort ys) == sort (xs ++ ys) 7Like 6', but with a custom ordering function. 8DReplace a subsequence everywhere it occurs. The first argument must  not be the empty list. / replace "el" "_" "Hello Bella" == "H_lo B_la" * replace "el" "e" "Hello" == "Helo" - replace "" "e" "Hello" == undefined 4 \xs ys -> not (null xs) ==> replace xs xs ys == ys 9Break, but from the end. * breakEnd isLower "youRE" == ("you","RE") * breakEnd isLower "youre" == ("youre","") * breakEnd isLower "YOURE" == ("","YOURE") :Span, but from the end. ) spanEnd isUpper "youRE" == ("you","RE") 1 spanEnd (not . isSpace) "x y z" == ("x y ","z") C \f xs-> spanEnd f xs == swap (both reverse (span f (reverse xs))) ; A variant of $ with a custom test. In particular, M adjacent separators are discarded, as are leading or trailing separators. < wordsBy (== ':') "::xyz:abc::123::" == ["xyz","abc","123"] $ \s -> wordsBy isSpace s == words s < A variant of $ with a custom test. In particular, : if there is a trailing separator it will be discarded. H linesBy (== ':') "::xyz:abc::123::" == ["","","xyz","abc","","123",""] & \s -> linesBy (== '\n') s == lines s : linesBy (== ';') "my;list;here;" == ["my","list","here"] =AFind the first element of a list for which the operation returns , along * with the result of the operation. Like $ but useful where the function also M computes some expensive information that can be reused. Particular useful % when the function is monadic, see  firstJustM. * firstJust id [Nothing,Just 3] == Just 3 + firstJust id [Nothing,Nothing] == Nothing >Equivalent to drop 1/, but likely to be faster and a single lexeme.  drop1 "" == ""  drop1 "test" == "est"  \xs -> drop 1 xs == drop1 xs ?Find the first instance of needle in haystack. ) The first element of the returned tuple  is the prefix of haystack before needle is matched. The second  is the remainder of haystack, starting with the match. + breakOn "::" "a::b::c" == ("a", "::b::c") * breakOn "/" "foobar" == ("foobar", "") a \needle haystack -> let (prefix,match) = breakOn needle haystack in prefix ++ match == haystack @ Similar to ?#, but searches from the end of the  string. 9The first element of the returned tuple is the prefix of haystack ' up to and including the last match of needle. The second is the  remainder of haystack, following the match. . breakOnEnd "::" "a::b::c" == ("a::b::", "c") A0Break a list into pieces separated by the first ? list argument, consuming the delimiter. An empty delimiter is 0 invalid, and will cause an error to be raised. 8 splitOn "\r\n" "a\r\nb\r\nd\r\ne" == ["a","b","d","e"] : splitOn "aaa" "aaaXaaaXaaaXaaa" == ["","X","X","X",""] . splitOn "x" "x" == ["",""] + splitOn "x" "" == [""] 6 \s x -> s /= "" ==> intercalate s (splitOn s x) == x B \c x -> splitOn [c] x == split (==c) x B7Splits a list into components delimited by separators, @ where the predicate returns True for a separator element. The C resulting components do not contain the separators. Two adjacent 8 separators result in an empty component in the output. 1 split (== 'a') "aabbaca" == ["","","bb","c",""] " split (== 'a') "" == [""] I split (== ':') "::xyz:abc::123::" == ["","","xyz","abc","","123","",""] 7 split (== ',') "my,list,here" == ["my","list","here"] C A version of + but with different strictness properties.  The function 8 can be used on an infinite list and tests the property # on each character. In contrast, C$ is strict in the spine of the list ' but only tests the trailing suffix. $ This version usually outperforms 0 if the list is short or the test is expensive. E Note the tests below cover both the prime and non-prime variants. . dropWhileEnd isSpace "ab cde " == "ab cde" . dropWhileEnd' isSpace "ab cde " == "ab cde" 6 last (dropWhileEnd even [undefined,3]) == undefined . last (dropWhileEnd' even [undefined,3]) == 3 . head (dropWhileEnd even (3:undefined)) == 3 6 head (dropWhileEnd' even (3:undefined)) == undefined D5Return the prefix of the second string if its suffix " matches the entire first string.  Examples: * stripSuffix "bar" "foobar" == Just "foo" * stripSuffix "" "baz" == Just "baz" ' stripSuffix "foo" "quux" == Nothing EESplit a list into chunks of a given size. The last chunk may contain ; fewer than n elements. The chunk size must be positive. + chunksOf 3 "my test" == ["my ","tes","t"] ' chunksOf 3 "mytest" == ["myt","est"]  chunksOf 8 "" == [] # chunksOf 0 "test" == undefined ) !"#$%&'()*+,-./0123456789:;<=>?@ABCDE      !"#$%& !"#$%&'()*+,-./0123456789:;<=>?@ABCDE*/0.,-1>"#$%&5432! ('9:C+D)*678;<=?@ABE) !"#$%&'()*+,-./0123456789:;<=>?@ABCDE Safe-InferredF#Evaluates the value before calling ' G#Evaluates the value before calling   FG (')* +, -FG F GFG Safe-InferredHThe H( function extracts the element out of a . and & throws an error if its argument is /.  Much like fromJust>, using this function in polished code is usually a bad idea.  \x -> fromLeft (Left x) == x ' \x -> fromLeft (Right x) == undefined IThe I( function extracts the element out of a / and & throws an error if its argument is ..  Much like fromJust>, using this function in polished code is usually a bad idea.  \x -> fromRight (Right x) == x ( \x -> fromRight (Left x) == undefined J Test if an 0 value is the . constructor. 0 Provided as standard with GHC 7.8 and above. K Test if an 0 value is the / constructor. 0 Provided as standard with GHC 7.8 and above. LPull the value out of an 0 where both alternatives  have the same type. ! \x -> fromEither (Left x ) == x ! \x -> fromEither (Right x) == x HIJKL 0./1234HIJKLJKHILHIJKL  Safe-InferredMPerform some operation on , given the field inside the . & whenJust Nothing print == return () $ whenJust (Just 1) print == print 1 N>The identity function which requires the inner argument to be '()'. Useful for functions ! with overloaded return times. ! \(x :: Maybe ()) -> unit x == x O A version of  partition& that works with a monadic predicate. 7 partitionM (Just . even) [1,2,3] == Just ([2], [1,3]) / partitionM (const Nothing) [1,2,3] == Nothing P A version of & that works with a monadic predicate. Q A version of 5& that works with a monadic predicate. R1A looping operation, where the predicate returns . as a seed for the next loop  or / to abort the loop. S+Keep running an operation until it becomes 6. As an example:   - whileM $ do sleep 0.1; notM $ doesFileExist foo.txt  readFile foo.txt 8If you need some state persisted between each test, use R. TLike 7%, but where the test can be monadic. ULike 8%, but where the test can be monadic. VLike if%, but where the test can be monadic. WLike 9%, but where the test can be monadic. X The lazy :* operator lifted to a monad. If the first  argument evaluates to ; the second argument will not  be evaluated. ( Just True ||^ undefined == Just True ( Just False ||^ Just True == Just True ) Just False ||^ Just False == Just False Y The lazy <* operator lifted to a monad. If the first  argument evaluates to 6 the second argument will not  be evaluated. ) Just False &&^ undefined == Just False ( Just True &&^ Just True == Just True ) Just True &&^ Just False == Just False Z A version of < lifted to a moand. Retains the short-circuiting behaviour. 0 anyM Just [False,True ,undefined] == Just True 0 anyM Just [False,False,undefined] == undefined = \(f :: Int -> Maybe Bool) xs -> anyM f xs == orM (map f xs) [ A version of < lifted to a moand. Retains the short-circuiting behaviour. 0 allM Just [True,False,undefined] == Just False / allM Just [True,True ,undefined] == undefined = \(f :: Int -> Maybe Bool) xs -> anyM f xs == orM (map f xs) \ A version of < lifted to a moand. Retains the short-circuiting behaviour. 4 orM [Just False,Just True ,undefined] == Just True 4 orM [Just False,Just False,undefined] == undefined * \xs -> Just (or xs) == orM (map Just xs) ] A version of < lifted to a moand. Retains the short-circuiting behaviour. 5 andM [Just True,Just False,undefined] == Just False 4 andM [Just True,Just True ,undefined] == undefined , \xs -> Just (and xs) == andM (map Just xs) ^Like find%, but where the test can be monadic. > findM (Just . isUpper) "teST" == Just (Just 'S') ; findM (Just . isUpper) "test" == Just Nothing > findM (Just . const True) ["x",undefined] == Just (Just "x") _Like ^O, but also allows you to compute some additional information in the predicate. MNOPQRSTUVWXYZ[\]^_<=>?@ABCDEFGHIJKLMNO7P8QRSTUVWXYZ[\]^_`abcMNOPQRSTUVWXYZ[\]^_MNOPQRSTUVWXY\]Z[^_MNOPQRSTUVWXYZ[\]^_  Safe-Inferred`SRemember that the current directory is a global variable, so calling this function S multithreaded is almost certain to go wrong. Avoid changing the dir if you can. a>Find all the files within a directory, including recursively. = Looks through all folders, including those beginning with .. bOCreate a directory with permissions so that only the current user can view it. - On Windows this function is equivalent to d. `ab&efghijklmnopqrstuvwxyz{|}~d`ab`ab`ab  Safe-Inferred c[Fully evaluate an input String. If the String contains embedded exceptions it will produce < Exception>. N stringException ("test" ++ undefined) == return "test<Exception>" N stringException ("test" ++ undefined ++ "hello") == return "test<Exception>" C stringException "test" == return "test" d=Show a value, but if the result contains exceptions, produce  < Exception> . Defined as c . show. U Particularly useful for printing exceptions to users, remembering that exceptions , can themselves contain undefined values. e,Ignore any exceptions thrown by the action.  ignore (print 1) == print 1 " ignore (fail "die") == return () f9Retry an operation at most N times (N must be positive). # retry 1 (print "x") == print "x" $ retry 3 (fail "die") == fail "die" g A version of  without the  context, restricted to ,  so catches all exceptions. hLike g but for  iLike g but for  jLike g but for  kLike g but for  lLike g but for  m_Catch an exception if the predicate passes, then call the handler with the original exception.  As an example:  = readFileExists x == catchBool isDoesNotExistError (readFile "myfile") (const $ return "") nLike m but for . oLike m but for . cdefghijklmno\cdefghijklmno fdcegikhjlmnocdefghijklmno Nonepqpqpqpq None| Capture the  and  of a computation. . captureOutput (print 1) == return ("1\n",()) rstuvwxyz{|}~z      !"#$%&'()*+,-./0123456789:;<=>?@ABCDErstuvwxyz{|}~rstuvwxyz{~|}rstuvwxyz{|}~None A version of F% that also captures the output, both  and . 3 Returns a pair of the exit code and the output.  A version of F that throws an error if the G is not H.  A version of F that captures the output (both  and )  and throws an error if the G is not H. %IJKLMNOPQRSTUVWXYZ[\F]^_`abcdefghi Safe-Inferred>Starts out empty, then is filled exactly once. As an example:    bar <-   forkIO $ do ...; val <- ...;  bar val  print =<<  bar AHere we create a barrier which will contain some computed value. G A thread is forked to fill the barrier, while the main thread waits I for it to complete. A barrier has similarities to a future or promise J from other languages, has been known as an IVar in other Haskell work, 6 and in some ways is like a manually managed thunk. 'Like an MVar, but must always be full. 7 Used to on a mutable variable in a thread-safe way.  As an example:    hits <-  0  forkIO $ do ...;  hits (+1); ...  i <-  hits  print (HITS,i) IHere we have a variable which we modify atomically, so modifications are I not interleaved. This use of MVar never blocks on a put. No modifyVar P operation should ever block, and they should always complete in a reasonable O timeframe. A Var should not be used to protect some external resource, only X the variable contained within. Information from a readVar should not be subsequently  inserted back into the Var.  Like an MVar, but has no value. R Used to guarantees single-threaded access, typically to some system resource.  As an example:    lock <-   let output =  . putStrLn  forkIO $ do ...; output "hello"  forkIO $ do ...; output "world" LHere we are creating a lock to ensure that when writing output our messages V do not get interleaved. This use of MVar never blocks on a put. It is permissible, H but rare, that a withLock contains a withLock inside it - but if so,  watch out for deadlocks. On GHC 7.6 and above with the  -threaded flag, brackets a call to . ! On lower versions (which lack /) this function just runs the argument action.  Create a new . %Perform some operation while holding . Will prevent all other  operations from using the  while the action is ongoing. Like ; but will never block. If the operation cannot be executed  immediately it will return .  Create a new  with a value. Read the current value of the .  Modify a , producing a new value and a return result.  Modify a , a restricted version of . .Perform some operation using the value in the ,  a restricted version of .  Create a new . 4Write a value into the Barrier, releasing anyone at . ) Any subsequent attempts to signal the  will be silently ignored. ,Wait until a barrier has been signaled with .  A version of  that never blocks, returning  - if the barrier has not yet been signaled. jklRmnopqrstuvwxyz{|}~jklNone  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~fdcegikhjlmnoMNOPQRSTUVWXY\]Z[^_JKHIL F G/0.,-1>"#$%&5432! ('9:C+D)*678;<=?@ABE`abpqrstuvwxyz{~|}  !"!#!$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd e f g h i j k l m n o p q r s t u v w x y z { | } ~  333333   3 3 3333333333333333333 3!3"3#3$3%3&3'3(3)3*3+3,3-3.3/303132333435363738393:3;3<3=3>3?3@3A3B3C3D3E3F3G3HIJIKILIM!N!O!PQRQSQTQUQVQWQXYZ[\[]^_^`a^bcdefg[h[ijk[l[m[n[o[p[q[r[s[t[u[v[w[x[y[z[{[|[}[~[[[[[[[[[[[        !"#$%&%'%(%)*+,-./01234567898:8;8<8=8>8?8@8A8B8C8DEFGH#I#J#K#L#M#N#O#P#Q#R#S#T#U#V#W#X#Y#Z#[#\#]#^#_#`#abcbdbebfbgbhbibjbkblbmnopqrnstnsunsvnswnsxnsynszns{ns|ns}ns~nsnsnsnsnsnsnsnonononononononononononononono extra-0.4System.Environment.Extra Numeric.ExtraControl.Concurrent.ExtraData.IORef.ExtraSystem.Time.ExtraData.Tuple.ExtraData.List.ExtraData.Either.ExtraControl.Monad.ExtraSystem.Directory.ExtraControl.Exception.ExtraSystem.Info.ExtraSystem.IO.ExtraSystem.Process.Extra Control.Arrow***&&&Extrabase!System.Environment.ExecutablePathgetExecutablePathSystem.Environment lookupEnvshowDP intToDouble intToFloat floatToDouble doubleToFloat GHC.Conc.SyncsetNumCapabilitiesControl.Concurrent forkFinally Data.IORef modifyIORef'atomicWriteIORefatomicModifyIORef'Secondssleep subtractTime showDuration offsetTimeoffsetTimeIncreasedurationfirstseconddupebothfst3snd3thd3 Data.List dropWhileEnd repeatedlyfordisjointanySameallSamelistunconsunsnocconssnoctakeEnddropEnd concatUnzip concatUnzip3 takeWhileEnd trimStarttrimEndtrimlowerupperword1sortOngroupOnnubOn groupSortmergemergeByreplacebreakEndspanEndwordsBylinesBy firstJustdrop1breakOn breakOnEndsplitOnsplit dropWhileEnd' stripSuffixchunksOf writeIORef'atomicWriteIORef'fromLeft fromRightisLeftisRight fromEitherwhenJustunit partitionM concatMapM mapMaybeMloopMwhileMwhenMunlessMifMnotM||^&&^anyMallMorMandMfindM firstJustMwithCurrentDirectorygetDirectoryContentsRecursivecreateDirectoryPrivatestringException showExceptionignoreretrycatch_ catchJust_handle_ handleJust_try_tryJust_ catchBool handleBooltryBool isWindowsgetProcessorCountreadFileEncoding readFileUTF8readFileBinary readFile'readFileEncoding' readFileUTF8'readFileBinary'writeFileEncoding writeFileUTF8writeFileBinary captureOutput withBuffering newTempFile withTempFile newTempDir withTempDir systemOutputsystem_ systemOutput_BarrierVarLockwithNumCapabilitiesnewLockwithLock withLockTrynewVarreadVar modifyVar modifyVar_withVar newBarrier signalBarrier waitBarrierwaitBarrierMaybe withProgNamewithArgs getProgNamegetEnvironmentgetEnvgetArgsGHC.Real fromIntegral realToFrac GHC.Float showFloatfromRat floatToDigits showSignedNumericshowOct showIntAtBaseshowIntshowHex showGFloat showFFloat showEFloat readSignedreadOctreadIntreadHex readFloatreadDecGHC.Read lexDigitsghc-prim GHC.TypesDouble Data.TuplefstsnduncurrycurryswapGHC.Basemap Data.MaybemaybeNothingGHC.Listheadtailinitlastunzipconcatunzip3 takeWhilesortgroupnubwordslinesJustfind++foldrfilterzipzipWith3zipWithzip3takesplitAtspanscanr1scanrscanl1scanlreverse replicaterepeatornullnotElemlookuplengthiteratefoldr1foldlelem dropWhiledropcycle concatMapbreakanyandall!!unwordsunlinessumproductminimummaximumfoldl1zipWith7zipWith6zipWith5zipWith4zip7zip6zip5zip4unzip7unzip6unzip5unzip4unionByunionunfoldr transposetails subsequences stripPrefixsortBy permutations partitionnubBy minimumBy maximumBy mapAccumR mapAccumL isSuffixOf isPrefixOf isInfixOf intersperse intersectBy intersect intercalateinsertByinsertinitsgroupBy genericTakegenericSplitAtgenericReplicate genericLength genericIndex genericDropfoldl1'foldl' findIndices findIndex elemIndices elemIndexdeleteFirstsBydeleteBydelete\\ GHC.IORef writeIORefIORef readIORefnewIORef modifyIORef mkWeakIORefatomicModifyIORef Data.EitherLeftRightEithereitherrightspartitionEithersleftsmapMaybeFalse Control.Monadwhenunless GHC.Classesnot||True&&fail>>=>>fmapreturnguardliftMMonadFunctor MonadPlus sequence_sequencemapM_mapM=<<mzeromplus zipWithM_zipWithMvoid replicateM_ replicateMmsummfilter mapAndUnzipMliftM5liftM4liftM3liftM2joinforeverforM_forMfoldM_foldMfilterMap>=><=<directory-1.2.0.1System.DirectorycreateDirectorywritable searchablereadable executable PermissionssetPermissionssetOwnerWritablesetOwnerSearchablesetOwnerReadablesetOwnerExecutablesetCurrentDirectory renameFilerenameDirectory removeFileremoveDirectoryRecursiveremoveDirectorymakeRelativeToCurrentDirectorygetUserDocumentsDirectorygetTemporaryDirectorygetPermissionsgetModificationTimegetHomeDirectorygetDirectoryContentsgetCurrentDirectorygetAppUserDataDirectoryfindFilefindExecutableemptyPermissions doesFileExistdoesDirectoryExistcreateDirectoryIfMissingcopyPermissionscopyFilecanonicalizePathControl.Exception.Basecatch GHC.Exception Exception SomeException catchJusthandle handleJusttrytryJustboolassertGHC.IO.ExceptionioError toException fromExceptionGHC.IOUnmaskedMaskedUninterruptibleMaskedInterruptible MaskingStateuninterruptibleMask_uninterruptibleMaskunblockthrowIOmask_maskgetMaskingStateevaluateblockedblockthrowTo IOExceptionDeadlockBlockedIndefinitelyOnSTMBlockedIndefinitelyOnMVar UserInterrupt ThreadKilled StackOverflow HeapOverflowAsyncExceptionAssertionFailedUndefinedElementIndexOutOfBoundsArrayException ErrorCall UnderflowRatioZeroDenominatorOverflowLossOfPrecision DivideByZeroDenormalArithException RecUpdError RecSelError RecConErrorPatternMatchFailNonTermination NoMethodErrorNestedAtomicallyControl.ExceptionHandlerthrow onException mapExceptionfinallybracket_bracketOnErrorbracketcatchesallowInterruptgetNumberOfProcessors System.InfooscompilerVersion compilerNamearchGHC.IO.Handle.FDstdoutstderr System.IOprintIOFilePath writeFilereadLnreadIOreadFileputStrLnputStrputCharinteractgetLine getContentsgetChar appendFileGHC.IO.Handle.TypesHandleGHC.IO.Encoding.Types TextEncoding GHC.IO.IOMode WriteMode ReadWriteModeReadMode AppendModeIOModeoutputNLinputNL NewlineModeLFCRLFNewline NoBuffering LineBufferingBlockBuffering BufferMode GHC.IO.Handle HandlePosn GHC.IO.Device SeekFromEnd RelativeSeek AbsoluteSeekSeekModewithFilewithBinaryFile"openTempFileWithDefaultPermissions openTempFile(openBinaryTempFileWithDefaultPermissionsopenBinaryTempFilelocaleEncodinghReadyhPrintfixIOuniversalNewlineModenoNewlineTranslationnativeNewlineMode nativeNewlineGHC.IO.Handle.Text hWaitForInput hPutStrLnhPutStrhPutCharhPutBufNonBlockinghPutBufhGetLine hGetContentshGetChar hGetBufSomehGetBufNonBlockinghGetBufstdinopenFileopenBinaryFileisEOFhTellhShowhSetPosnhSetNewlineMode hSetFileSize hSetEncodinghSetEcho hSetBufferinghSetBinaryModehSeek hLookAhead hIsWritablehIsTerminalDevice hIsSeekable hIsReadablehIsOpenhIsEOF hIsClosedhGetPosn hGetEncodinghGetEcho hGetBufferinghFlush hFileSizehCloseGHC.IO.Encodingutf8_bomutf8utf32leutf32beutf32utf16leutf16beutf16mkTextEncodinglatin1char8process-1.1.0.2System.ProcesssystemExitCode ExitSuccessSystem.Process.Internals UseHandleInherit CreatePipe StdStream ProcessHandlestd_outstd_instd_errenvcwd create_groupcmdspec close_fds CreateProcess ShellCommand RawCommandCmdSpecwaitForProcessterminateProcessshowCommandForUsershell runProcessrunInteractiveProcessrunInteractiveCommand runCommandreadProcessWithExitCode readProcess rawSystemprocinterruptProcessGroupOfgetProcessExitCode createProcessGHC.MVarMVarThreadIdControl.Concurrent.SampleVar SampleVarControl.Concurrent.QSemNQSemNControl.Concurrent.QSemQSemControl.Concurrent.ChanChan tryTakeMVar tryPutMVartakeMVarputMVarnewMVar newEmptyMVar isEmptyMVaryieldthreadCapability myThreadIdmkWeakThreadId killThreadgetNumCapabilitiesforkOnWithUnmaskforkOnforkIOWithUnmaskforkIOUnmaskedforkIO GHC.Conc.IO threadDelaywriteSampleVar readSampleVar newSampleVarnewEmptySampleVarisEmptySampleVaremptySampleVar waitQSemN signalQSemNnewQSemNwaitQSem signalQSemnewQSemControl.Concurrent.MVarwithMVarswapMVarreadMVar modifyMVar_modifyMVarMasked_modifyMVarMasked modifyMVar mkWeakMVaraddMVarFinalizerwriteList2Chan writeChan unGetChanreadChannewChan isEmptyChangetChanContentsdupChanthreadWaitWritethreadWaitReadrunInUnboundThreadrunInBoundThreadrtsSupportsBoundThreadsnmergeIOmergeIOisCurrentThreadBoundforkOS