25 lines
646 B
Haskell
25 lines
646 B
Haskell
module RosettaSelect where
|
|
|
|
import Data.Maybe (listToMaybe)
|
|
import Control.Monad (guard)
|
|
|
|
select :: [String] -> IO String
|
|
select [] = return ""
|
|
select menu = do
|
|
putStr $ showMenu menu
|
|
putStr "Choose an item: "
|
|
choice <- getLine
|
|
maybe (select menu) return $ choose menu choice
|
|
|
|
showMenu :: [String] -> String
|
|
showMenu menu = unlines [show n ++ ") " ++ item | (n, item) <- zip [1..] menu]
|
|
|
|
choose :: [String] -> String -> Maybe String
|
|
choose menu choice = do
|
|
n <- maybeRead choice
|
|
guard $ n > 0
|
|
listToMaybe $ drop (n-1) menu
|
|
|
|
maybeRead :: Read a => String -> Maybe a
|
|
maybeRead = fmap fst . listToMaybe . filter (null . snd) . reads
|