2020-12-04 22:22:14 +00:00
|
|
|
package tf.bug.aoc
|
|
|
|
|
2020-12-05 01:26:20 +00:00
|
|
|
import cats._
|
2020-12-04 22:22:14 +00:00
|
|
|
import cats.effect._
|
|
|
|
import cats.effect.std.Console
|
|
|
|
import cats.syntax.all._
|
|
|
|
import java.nio.charset.StandardCharsets
|
|
|
|
import fs2._
|
|
|
|
|
2020-12-06 22:39:00 +00:00
|
|
|
object Main extends IOApp {
|
2020-12-04 22:22:14 +00:00
|
|
|
|
|
|
|
def years: Map[Int, Year] = Map(
|
|
|
|
2020 -> y2020.y2020,
|
|
|
|
)
|
|
|
|
|
2020-12-06 22:39:00 +00:00
|
|
|
override def run(args: List[String]): IO[ExitCode] = {
|
2020-12-04 22:22:14 +00:00
|
|
|
val year: IO[Year] = selectYear[IO]
|
|
|
|
val day: IO[Day] = year >>= selectDay[IO]
|
|
|
|
val part: IO[Pipe[IO, String, String]] = day >>= selectPart[IO]
|
|
|
|
part.flatMap { p =>
|
|
|
|
io.stdinUtf8[IO](1024)
|
|
|
|
.through(text.lines)
|
|
|
|
.through(p)
|
|
|
|
.through(io.stdoutLines(StandardCharsets.UTF_8))
|
|
|
|
.compile.drain
|
|
|
|
}.as(ExitCode.Success)
|
2020-12-06 22:39:00 +00:00
|
|
|
}
|
2020-12-04 22:22:14 +00:00
|
|
|
|
2020-12-06 22:39:00 +00:00
|
|
|
def selectYear[F[_]: Monad: Console]: F[Year] = {
|
2020-12-05 01:26:20 +00:00
|
|
|
val ask = Console[F].print("Select year: ")
|
2020-12-04 22:22:14 +00:00
|
|
|
val receive = Console[F].readLine
|
|
|
|
val year: F[Option[Year]] = (ask >> receive).map(_.toIntOption >>= years.get)
|
|
|
|
year.flatMap {
|
|
|
|
case Some(year) => year.pure[F]
|
|
|
|
case None => selectYear[F]
|
|
|
|
}
|
2020-12-06 22:39:00 +00:00
|
|
|
}
|
2020-12-04 22:22:14 +00:00
|
|
|
|
2020-12-06 22:39:00 +00:00
|
|
|
def selectDay[F[_]: Monad: Console](year: Year): F[Day] = {
|
2020-12-05 01:26:20 +00:00
|
|
|
val ask = Console[F].print("Select day: ")
|
2020-12-04 22:22:14 +00:00
|
|
|
val receive = Console[F].readLine
|
|
|
|
val day: F[Option[Day]] = (ask >> receive).map(_.toIntOption >>= year.days.get)
|
|
|
|
day.flatMap {
|
|
|
|
case Some(day) => day.pure[F]
|
|
|
|
case None => selectDay[F](year)
|
|
|
|
}
|
2020-12-06 22:39:00 +00:00
|
|
|
}
|
2020-12-04 22:22:14 +00:00
|
|
|
|
2020-12-06 22:39:00 +00:00
|
|
|
def selectPart[F[_]: Async: Console](day: Day): F[Pipe[F, String, String]] = {
|
2020-12-05 01:26:20 +00:00
|
|
|
val ask = Console[F].print("Select part: ")
|
2020-12-04 22:22:14 +00:00
|
|
|
val receive = Console[F].readLine
|
|
|
|
val part: F[Option[Int]] = (ask >> receive).map(_.toIntOption)
|
|
|
|
part.flatMap {
|
|
|
|
case Some(1) => day.part1[F].pure[F]
|
|
|
|
case Some(2) => day.part2[F].pure[F]
|
|
|
|
case _ => selectPart[F](day)
|
|
|
|
}
|
2020-12-06 22:39:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|