1 module Main(main) where 2 3 import qualified IO 4 import System(getArgs) 5 import Monad(mapM_) 6 import qualified Scaffolding 7 8 mergesort l = 9 if (length l) <= 1 then l -- The list is already sorted. 10 else -- Split the list into two halves and sort these. 11 merge (mergesort lpart) (mergesort rpart) [] 12 where llen_half = (length l) `div` 2 13 (lpart, rpart) = splitAt llen_half l 14 15 -- Case #1: the right list is empty; just append the left list to the 16 -- accumulator. The latter is reversed because we were prepending 17 -- to it in case #3. 18 merge lpart [] acc = (reverse acc) ++ lpart 19 20 -- Case #2: the left list is empty; just append the right list to the 21 -- (reversed) accumulator list. 22 merge [] rpart acc = (reverse acc) ++ rpart 23 24 -- Case #3: neither of the left/right lists to be merged is empty; 25 -- prepend the lesser head element to the accumulator list. 26 merge (l:ls) (r:rs) acc = 27 if l <= r then merge ls (r:rs) (l:acc) 28 else merge (l:ls) rs (r:acc) 29 30 -- The main method, handles command line arguments, input and output. 31 main = do 32 args <- getArgs 33 fileh <- case head args of 34 -- The text to be sorted is to be read from stdin. 35 "-" -> do return (Just IO.stdin) 36 -- The text to be sorted is to be read from the file 37 -- specified. 38 "-f" -> do Scaffolding.openFile (head (tail args)) 39 -- Just sort the command line parameters. 40 _ -> do let sorted_args = mergesort args 41 IO.putStrLn ("mergesort(" ++ show args ++ 42 ") = " ++ show sorted_args) 43 return Nothing 44 case fileh of 45 -- Read text from file handle, sort it and print to stdout. 46 Just fileh -> do text_to_sort <- Scaffolding.readLines fileh [] 47 mapM_ IO.putStrLn (mergesort text_to_sort) 48 -- We failed to open the file specified (if any). 49 Nothing -> do return ()