def getChar: IO[Char] = IO(System.in.read().toChar)
def putChar(c: Char): IO[Unit] = IO(print(c))
def echo: IO[Unit] =
for {
c <- getChar
_ <- putChar('\n')
_ <- putChar(c)
_ <- putChar('\n')
} yield ()
def getLine: IO[List[Char]] =
for {
x <- getChar
r <- if (x == '\n') IO(Nil)
else
for {
xs <- getLine
} yield x :: xs
} yield r
def putStr(s: String): IO[Unit] = s.toCharArray.toList match {
case Nil => IO(())
case x :: xs =>
for {
_ <- putChar(x)
_ <- putStr(xs.mkString)
} yield ()
}
def putStrLn(s: String): IO[Unit] =
for {
_ <- putStr(s)
_ <- putChar('\n')
} yield ()
def strlen: IO[Unit] =
for {
_ <- putStr("Enter a string: ")
x <- getLine
_ <- putStr("The string has ")
_ <- putStr(x.length.toString)
_ <- putStrLn(" characters")
} yield ()
def cls = putStr("\033[2J")
type Pos = (Int, Int)
def goto(p: Pos) =
putStr("\033[" + p._2.toString + ";" + p._1.toString + "H")
def writeat(p: Pos)(s: String): IO[Unit] =
for {
_ <- goto(p)
_ <- putStr(s)
} yield ()
def seqn[T](seq: List[IO[T]]): IO[Unit] = seq match {
case Nil => IO(())
case a :: as =>
for {
_ <- a
_ <- seqn(as)
} yield ()
}
seqn((1 to 9).map(_.toString charAt 0).map(putChar).toList).unsafeRunSync()