import Effects import Effect.Exception import Effect.StdIO import Data.Vect read_vec : Eff (p ** Vect p Int) [STDIO] read_vec = do putStr "Number (-1 when done): " case run (parseNumber (trim !getStr)) of Nothing => do putStrLn "Input error" read_vec Just v => if (v /= -1) then do (_ ** xs) <- read_vec pure (_ ** v :: xs) else pure (_ ** []) where parseNumber : String -> Eff Int [EXCEPTION String] parseNumber str = if all (\x => isDigit x || x == '-') (unpack str) then pure (cast str) else raise "Not a number"