!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ K L M 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 uvwxyz{|}~  Safe-Inferred Return  on Windows and ! otherwise. A runtime version of #ifdef minw32_HOST_OS.  Equivalent to os == "mingw32", but: more efficient; doesn't require typing an easily G mistypeable string; actually asks about your OS not a library; doesn' t bake in - 32bit assumptions that are already false. </rant>  isWindows == (os == "mingw32")      Safe-Inferred Safe-Inferred 3Show 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) 6Apply a single function to both components 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 0. /,Remove spaces from the end of a string, see 0. 0=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) 1 Convert a string to lower case. , lower "This is A TEST" == "this is a test"  lower "" == "" 2 Convert a string to upper case. , upper "This is A TEST" == "THIS IS A TEST"  upper "" == "" 3SSplit the first word off a string. Useful for when starting to parse the beginning Z of a string, but you want to accurately perserve whitespace in the rest of the string.  word1 "" == ("", "") @ word1 "keyword rest of string" == ("keyword","rest of string") E word1 " keyword\n rest of string" == ("keyword","rest of string") 2 \s -> fst (word1 s) == concat (take 1 $ words s) 1 \s -> words (snd $ word1 s) == drop 1 (words s) 4GSort a list by comparing the results of a key function applied to each  element. sortOn f is equivalent to sortBy (comparing f), but has the * performance advantage of only evaluating f once for each element in the G input list. This is called the decorate-sort-undecorate paradigm, or  Schwartzian transform. A sortOn fst [(3,"z"),(1,""),(3,"a")] == [(1,""),(3,"z"),(3,"a")] 5 A version of 5 where the equality is done on some extracted value. 6 A version of 5 where the equality is done on some extracted value.  nubOn f is equivalent to  nubBy ((==)  f), but has the , performance advantage of only evaluating f once for each element in the  input list. 7A 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) 81Merge two lists which are assumed to be ordered.  merge "ace" "bd" == "abcde" 8 \xs ys -> merge (sort xs) (sort ys) == sort (xs ++ ys) 9Like 8', but with a custom ordering function. :DReplace 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 ;Break, 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 AFind 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 B Similar to A#, 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") C0Break 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 D7Splits 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"] E 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, E$ 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 F5Return 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 GESplit 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:;<=>?@ABCDEFG      !"#$%&'()*+,-./01 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG*120./3*);<E-F=>ABCDG$%&'(@7654!#" ?+,:89) !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFG Safe-InferredH#Evaluates the value before calling 2. I#Evaluates the value before calling . HI 3452678HIHIHI  Safe-InferredJThe J( function extracts the element out of a 9 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 KThe K( function extracts the element out of a : and & throws an error if its argument is 9.  Much like fromJust>, using this function in polished code is usually a bad idea.  \x -> fromRight (Right x) == x ( \x -> fromRight (Left x) == undefined L Test if an ; value is the 9 constructor. 0 Provided as standard with GHC 7.8 and above. M Test if an ; value is the : constructor. 0 Provided as standard with GHC 7.8 and above. NPull the value out of an ; where both alternatives  have the same type. ! \x -> fromEither (Left x ) == x ! \x -> fromEither (Right x) == x JKLMN ;9:<=>?JKLMNLMJKNJKLMN  Safe-InferredOPerform some operation on , given the field inside the . & whenJust Nothing print == return () $ whenJust (Just 1) print == print 1 P>The identity function which requires the inner argument to be (). Useful for functions ! with overloaded return times. ! \(x :: Maybe ()) -> unit x == x Q 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 R A version of & that works with a monadic predicate. S A version of @& that works with a monadic predicate. T1A looping operation, where the predicate returns 9 as a seed for the next loop  or : to abort the loop. U+Keep running an operation until it becomes . 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 T. VLike A%, but where the test can be monadic. WLike B%, but where the test can be monadic. XLike if%, but where the test can be monadic. YLike C%, but where the test can be monadic. Z The lazy D* 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 [ The lazy E* operator lifted to a monad. If the first  argument evaluates to  the second argument will not  be evaluated. ) Just False &&^ undefined == Just False ( Just True &&^ Just True == Just True ) Just True &&^ Just False == Just False \ 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") aLike `O, but also allows you to compute some additional information in the predicate. OPQRSTUVWXYZ[\]^_`a<FGHIJKLMNOPQRSTUBAVWXYZ[\]^_`abcdefghijklOPQRSTUVWXYZ[\]^_`aOPTUQRS`aVWXYZ[^_\]OPQRSTUVWXYZ[\]^_`a  Safe-InferredbCSet the current directory, perform an operation, then change back. V Remember that the current directory is a global variable, so calling this function a multithreaded is almost certain to go wrong. Avoid changing the current directory if you can. o withTempDir $ \dir -> do writeFile (dir </> "foo.txt") ""; withCurrentDirectory dir $ doesFileExist "foo.txt" c<List the files and directories directly within a directory. T Each result will be prefixed by the query directory, and the special directories . and .. will be ignored. ' Intended as a cleaned up version of m. l withTempDir $ \dir -> do writeFile (dir </> "test.txt") ""; (== [dir </> "test.txt"]) <$> listContents dir ] let touch = mapM_ $ \x -> createDirectoryIfMissing True (takeDirectory x) >> writeFile x ""  let listTest op as bs = withTempDir $ \dir -> do touch $ map (dir </>) as; res <- op dir; return $ map (drop (length dir + 1)) res == bs O listTest listContents ["bar.txt","foo/baz.txt","zoo"] ["bar.txt","foo","zoo"] dLike cD, but only returns the files in a directory, not other directories. 6 Each file will be prefixed by the query directory. F listTest listFiles ["bar.txt","foo/baz.txt","zoo"] ["bar.txt","zoo"] eLike d3, but goes recursively through all subdirectories. i listTest listFilesRecursive ["bar.txt","zoo","foo" </> "baz.txt"] ["bar.txt","zoo","foo" </> "baz.txt"] fLike e8, but with a predicate to decide where to recurse into. ' Typically directories starting with .2 would be ignored. The initial argument directory % will have the test applied to it. K listTest (listFilesInside $ return . not . isPrefixOf "." . takeFileName) h ["bar.txt","foo" </> "baz.txt",".foo" </> "baz2.txt", "zoo"] ["bar.txt","zoo","foo" </> "baz.txt"] B listTest (listFilesInside $ const $ return False) ["bar.txt"] [] gOCreate a directory with permissions so that only the current user can view it. - On Windows this function is equivalent to n. bcdefg)opqrstuvwmxyz{|}~nbcdefgbgcdfebcdefg  Safe-Inferred h[Fully evaluate an input String. If the String contains embedded exceptions it will produce < Exception>. C stringException "test" == return "test" N stringException ("test" ++ undefined) == return "test<Exception>" N stringException ("test" ++ undefined ++ "hello") == return "test<Exception>" N stringException ['t','e','s','t',undefined] == return "test<Exception>" i=Show a value, but if the result contains exceptions, produce  < Exception> . Defined as h . show. U Particularly useful for printing exceptions to users, remembering that exceptions , can themselves contain undefined values. j,Ignore any exceptions thrown by the action.  ignore (print 1) == print 1 " ignore (fail "die") == return () kRetry an operation at most n times (n must be positive).  If the operation fails the n,th time it will throw that final exception. # retry 1 (print "x") == print "x" $ retry 3 (fail "die") == fail "die" l A version of  without the  context, restricted to ,  so catches all exceptions. mLike l but for  nLike l but for  oLike l but for  pLike l but for  qLike l but for  r_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 "") sLike r but for . tLike r but for . hijklmnopqrst\hijklmnopqrst kihjlnpmoqrsthijklmnopqrst Safe-Inferredu>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. v'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. w Like an MVar, but has no value. R Used to guarantees single-threaded access, typically to some system resource.  As an example:    lock <- z  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. xOn 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. yBGiven an action, produce a wrapped action that runs at most once. W If the function raises an exception, the same exception will be reraised each time. z Create a new w. {%Perform some operation while holding w. Will prevent all other  operations from using the w while the action is ongoing. |Like {; but will never block. If the operation cannot be executed  immediately it will return . } Create a new v with a value. ~Read the current value of the v.  Modify a v, producing a new value and a return result.  Modify a v, a restricted version of . .Perform some operation using the value in the v,  a restricted version of .  Create a new u. 4Write a value into the Barrier, releasing anyone at . ) Any subsequent attempts to signal the u 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. uvwxyz{|}~S      !"#$uvwxyz{|}~xywz{|v}~uuvwxyz{|}~ NoneLike %, but setting an encoding. Like %, but with the encoding &. Like %, but for binary files. A strict version of %*. When the string is produced, the entire S file will have been read into memory and the file handle will have been closed. C Closing the file handle does not rely on the garbage collector. A strict version of , see  for details. A strict version of , see  for details. A strict version of , see  for details. )Write a file with a particular encoding. Write a file with the & encoding. Write a binary file.  Capture the ' and ( of a computation. . captureOutput (print 1) == return ("1\n",())  Execute an action with a custom ), a warpper around  *. EProvide a function to create a temporary file, and a way to delete a ) temporary file. Most users should use  which  combines these operations. MCreate a temporary file in the temporary directory. The file will be deleted E after the action completes (provided the file is not still open).  The +L will not have any file extension, will exist, and will be zero bytes long. 3 If you require a file with a specific name, use . + withTempFile doesFileExist == return True 9 (doesFileExist =<< withTempFile return) == return False % withTempFile readFile' == return "" JProvide a function to create a temporary directory, and a way to delete a . temporary directory. Most users should use  which  combines these operations. DCreate a temporary directory inside the system temporary directory. = The directory will be deleted after the action completes. / withTempDir doesDirectoryExist == return True = (doesDirectoryExist =<< withTempDir return) == return False $ withTempDir listFiles == return [] z,-./0123456789:;<=%>?@ABCDEF(GHIJKLMNOPQRSTUVWXY*Z[\]^_`abcdefghijklmnopqrst&u'vwxyz{|})~+None A version of % that also captures the output, both ' and (.  Returns a pair of the  and the output.  A version of  that throws an error if the  is not .  A version of  that captures the output (both ' and ()  and throws an error if the  is not . %None  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~xywz{|v}~ukihjlnpmoqrstOPTUQRS`aVWXYZ[^_\]LMJKNHI120./3*);<E-F=>ABCDG$%&'(@7654!#" ?+,:89 bgcdfe  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`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 { | } ~   !!!!!!!!!!!!!!!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZV[V\V]^_^`^a^b^c^d^efghgijkjljmnopqrgsgtuvgwgxgygzg{g|g}g~gggggggggggggggggggggg       ! " # $ % & ' ( )*+,-,.,/,0,1,2,3,4,56789:;<=>?@ABACADAEAFAGAHAIJKLMNONPQRSTUJVWJXQYJZJ[J\J]J^J_J`JaJbJcJdJeJfJgJhJiJjJkJlJmNnNoNpNqSrSsStSuSvSwSxSySzS{S|S}S~SSSSSSSSSSSLLLLLLLLLLSQQQQQQQQQQQQQQ extra-0.5System.Environment.ExtraControl.Concurrent.ExtraData.IORef.ExtraData.List.ExtraSystem.Info.Extra Numeric.ExtraSystem.Time.ExtraData.Tuple.ExtraData.Either.ExtraControl.Monad.ExtraSystem.Directory.ExtraControl.Exception.ExtraSystem.IO.ExtraSystem.Process.Extra Control.Arrow***&&&ExtrabaseSystem.Environment lookupEnv!System.Environment.ExecutablePathgetExecutablePathControl.Concurrent forkFinally GHC.Conc.SyncsetNumCapabilitiesgetNumCapabilities Data.IORefatomicWriteIORefatomicModifyIORef' modifyIORef' Data.List dropWhileEnd isWindowsshowDP intToDouble intToFloat floatToDouble doubleToFloatSecondssleep subtractTime showDuration offsetTimeoffsetTimeIncreasedurationfirstseconddupebothfst3snd3thd3 repeatedlyfordisjointanySameallSamelistunconsunsnocconssnoctakeEnddropEnd concatUnzip concatUnzip3 takeWhileEnd trimStarttrimEndtrimlowerupperword1sortOngroupOnnubOn groupSortmergemergeByreplacebreakEndspanEndwordsBylinesBy firstJustdrop1breakOn breakOnEndsplitOnsplit dropWhileEnd' stripSuffixchunksOf writeIORef'atomicWriteIORef'fromLeft fromRightisLeftisRight fromEitherwhenJustunit partitionM concatMapM mapMaybeMloopMwhileMwhenMunlessMifMnotM||^&&^anyMallMorMandMfindM firstJustMwithCurrentDirectory listContents listFileslistFilesRecursivelistFilesInsidecreateDirectoryPrivatestringException showExceptionignoreretrycatch_ catchJust_handle_ handleJust_try_tryJust_ catchBool handleBooltryBoolBarrierVarLockwithNumCapabilitiesoncenewLockwithLock withLockTrynewVarreadVar modifyVar modifyVar_withVar newBarrier signalBarrier waitBarrierwaitBarrierMaybereadFileEncoding readFileUTF8readFileBinary readFile'readFileEncoding' readFileUTF8'readFileBinary'writeFileEncoding writeFileUTF8writeFileBinary captureOutput withBuffering newTempFile withTempFile newTempDir withTempDir systemOutputsystem_ systemOutput_ghc-prim GHC.TypesTrueFalse System.Info compilerNamearchoscompilerVersiongetEnvironment withProgNamewithArgsgetEnv getProgNamegetArgsGHC.Real fromIntegral realToFracNumericshowOctshowHex showIntAtBase showGFloat showFFloat showEFloatshowInt readSigned readFloatreadHexreadDecreadOctreadIntGHC.Read lexDigits GHC.FloatfromRat floatToDigits showFloat showSignedDouble Data.TuplefstsndswapuncurrycurryGHC.Basemap Data.MaybemaybeNothingGHC.Listheadtailinitlastunzipconcatunzip3 takeWhilegroupnub Data.FunctiononsortwordslinesJustfind++foldrfilterzipunwordsunlinesproductsumfoldl1'foldl1foldl'unfoldrsortBy permutations subsequencestailsinitsgroupBydeleteFirstsByunzip7unzip6unzip5unzip4zipWith7zipWith6zipWith5zipWith4zip7zip6zip5zip4genericReplicate genericIndexgenericSplitAt genericDrop genericTake genericLength minimumBy maximumByminimummaximuminsertByinsert mapAccumR mapAccumL partition transpose intercalate intersperse intersectBy intersectunionByunion\\deleteBydeletenubBy isInfixOf isSuffixOf isPrefixOf findIndices findIndex elemIndices elemIndex stripPrefixzipWith3zipWithzip3!! concatMaplookupnotElemelemallanyorandreversebreakspansplitAtdroptake dropWhilecycle replicaterepeatiteratescanr1scanrfoldr1scanl1scanlfoldllengthnull GHC.IORef writeIORefatomicModifyIORef modifyIORef mkWeakIORef readIORefnewIORefIORef Data.EitherLeftRightEitherpartitionEithersrightsleftseithermapMaybe Control.Monadwhenunless GHC.Classesnot||&&fail>>=>>fmapreturnguardliftMMonadFunctor MonadPlusmfilterapliftM5liftM4liftM3liftM2 replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMjoinvoidforever<=<>=>msumforM_forMfilterMmapM_mapM sequence_sequence=<<mplusmzerodirectory-1.2.0.1System.DirectorygetDirectoryContentscreateDirectorygetTemporaryDirectorygetUserDocumentsDirectorygetAppUserDataDirectorygetHomeDirectorygetModificationTime doesFileExistdoesDirectoryExistsetCurrentDirectorygetCurrentDirectoryfindFilefindExecutablemakeRelativeToCurrentDirectorycanonicalizePathcopyFile renameFilerenameDirectory removeFileremoveDirectoryRecursiveremoveDirectorycreateDirectoryIfMissingcopyPermissionssetPermissionsgetPermissionssetOwnerSearchablesetOwnerExecutablesetOwnerWritablesetOwnerReadableemptyPermissions searchable executablewritablereadable PermissionsControl.Exception.Basecatch GHC.Exception Exception SomeException catchJusthandle handleJusttrytryJustboolassertControl.ExceptionallowInterruptcatchesHandlerbracketOnErrorbracket_finallybracket onException mapExceptionPatternMatchFail RecSelError RecConError RecUpdError NoMethodErrorNonTerminationNestedAtomicallythrowToGHC.IO.ExceptionioErrorBlockedIndefinitelyOnMVarBlockedIndefinitelyOnSTMDeadlockAssertionFailed StackOverflow HeapOverflow ThreadKilled UserInterruptAsyncExceptionIndexOutOfBoundsUndefinedElementArrayExceptionGHC.IOevaluateuninterruptibleMaskuninterruptibleMask_maskmask_blockedgetMaskingStateunblockblockthrowIOUnmaskedMaskedInterruptibleMaskedUninterruptible MaskingState IOExceptionthrow fromException toException ErrorCallOverflow UnderflowLossOfPrecision DivideByZeroDenormalRatioZeroDenominatorArithExceptionOnceOnceDone OnceRunning OncePendingthreadWaitWritethreadWaitReadrunInUnboundThreadrunInBoundThreadisCurrentThreadBoundforkOSnmergeIOmergeIOrtsSupportsBoundThreadsControl.Concurrent.SampleVarisEmptySampleVarwriteSampleVar readSampleVaremptySampleVar newSampleVarnewEmptySampleVar SampleVarControl.Concurrent.QSemN signalQSemN waitQSemNnewQSemNQSemNControl.Concurrent.QSem signalQSemwaitQSemnewQSemQSemControl.Concurrent.ChanwriteList2ChangetChanContents isEmptyChan unGetChandupChanreadChan writeChannewChanChan GHC.Conc.IO threadDelayControl.Concurrent.MVar mkWeakMVaraddMVarFinalizermodifyMVarMaskedmodifyMVarMasked_ modifyMVar modifyMVar_withMVarswapMVarreadMVarmkWeakThreadIdthreadCapabilityyield myThreadId killThreadforkOnWithUnmaskforkOnforkIOWithUnmaskforkIOUnmaskedforkIOThreadIdGHC.MVar isEmptyMVar tryPutMVar tryTakeMVarputMVartakeMVarnewMVar newEmptyMVarMVar System.IOreadFileGHC.IO.Encodingutf8GHC.IO.Handle.FDstdoutstderrGHC.IO.Handle.Types BufferMode GHC.IO.Handle hSetBufferingFilePathprintIOgetLineHandle(openBinaryTempFileWithDefaultPermissions"openTempFileWithDefaultPermissionsopenBinaryTempFile openTempFilefixIOwithBinaryFilewithFilehPrinthReadylocaleEncodingreadIOreadLn appendFile writeFileinteract getContentsgetCharputStrLnputStrputCharopenBinaryFileopenFileisEOFstdinhShowhSetNewlineModehSetBinaryModehIsTerminalDevicehGetEchohSetEcho hIsSeekable hGetBuffering hIsWritable hIsReadable hIsClosedhIsOpenhTellhSeekhSetPosnhGetPosn hGetEncoding hSetEncoding hLookAheadhIsEOF hSetFileSize hFileSizehClose HandlePosnGHC.IO.Handle.TexthGetBufNonBlocking hGetBufSomehGetBufhPutBufNonBlockinghPutBuf hPutStrLnhPutStrhPutChar hGetContentshGetLinehGetChar hWaitForInputmkTextEncodingchar8utf32beutf32leutf32utf16beutf16leutf16utf8_bomlatin1hFlushnoNewlineTranslationnativeNewlineModeuniversalNewlineMode nativeNewline NoBuffering LineBufferingBlockBufferingLFCRLFNewlineoutputNLinputNL NewlineModeGHC.IO.Encoding.Types TextEncoding GHC.IO.Device AbsoluteSeek RelativeSeek SeekFromEndSeekMode GHC.IO.IOModeReadMode WriteMode AppendMode ReadWriteModeIOModeprocess-1.1.0.2System.ProcesssystemExitCode ExitSuccessgetProcessExitCodeinterruptProcessGroupOfterminateProcessshowCommandForUser rawSystemreadProcessWithExitCode readProcesswaitForProcessrunInteractiveProcessrunInteractiveCommand createProcessshellproc runProcess runCommandSystem.Process.Internals ProcessHandle create_group close_fdsstd_errstd_outstd_inenvcwdcmdspec CreateProcess ShellCommand RawCommandCmdSpecInherit UseHandle CreatePipe StdStream