2025-12-27 22:22:54 +01:00
|
|
|
{ writers }:
|
|
|
|
|
writers.writeHaskellBin "manual-sort" { } ''
|
2023-02-24 23:10:45 +01:00
|
|
|
{-# LANGUAGE LambdaCase #-}
|
|
|
|
|
import Data.Char (toLower)
|
|
|
|
|
import System.Environment (getArgs)
|
|
|
|
|
import System.IO (BufferMode(NoBuffering), hSetBuffering, stdout)
|
|
|
|
|
|
|
|
|
|
insertionSortM :: Monad f => (a -> a -> f Ordering) -> [a] -> f [a]
|
|
|
|
|
insertionSortM cmp = foldr ((=<<) . insertByM cmp) (pure [])
|
|
|
|
|
where
|
|
|
|
|
insertByM cmp x = \case
|
|
|
|
|
[] -> pure [x]
|
|
|
|
|
yys@(y : ys) -> cmp x y >>= \case
|
|
|
|
|
GT -> (y :) <$> insertByM cmp x ys
|
|
|
|
|
_ -> pure (x : yys)
|
|
|
|
|
|
|
|
|
|
ask :: Show a => a -> a -> IO Ordering
|
|
|
|
|
ask a b = do
|
|
|
|
|
putStr (show a ++ " > " ++ show b ++ "? (y/n) ")
|
|
|
|
|
map toLower <$> getLine >>= \case
|
|
|
|
|
'y' : _ -> return GT
|
|
|
|
|
_ -> return LT
|
|
|
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
|
main = do
|
|
|
|
|
hSetBuffering stdout NoBuffering
|
|
|
|
|
argv <- getArgs
|
|
|
|
|
sorted <- insertionSortM ask argv
|
|
|
|
|
mapM_ (\(place, thing) -> putStrLn (show place ++ ". " ++ show thing)) $ zip [1 ..] (reverse sorted)
|
|
|
|
|
''
|