Skip to content

Instantly share code, notes, and snippets.

View dariathecracker's full-sized avatar

Daria dariathecracker

View GitHub Profile
endpoint.errorOut( oneOf[String](
statusMapping(StatusCode.Unauthorized, stringBody),
statusMapping(StatusCode.BadRequest, stringBody) ) )
endpoint.errorOut(statusCode(StatusCode.Unauthorized).and(stringBody))
@dariathecracker
dariathecracker / ioleo.tictactoe.scala
Last active June 4, 2020 11:40
Call RunLoop service
package ioleo.tictactoe
import ioleo.tictactoe.domain.State
import zio.{console, App, UIO, ZIO}
object TicTacToe extends App {
val program = {
def loop(state: State): ZIO[app.RunLoop, Nothing, Unit] =
app.RunLoop.>.step(state).foldM(
@dariathecracker
dariathecracker / ioleo.tictactoe.scala
Last active June 4, 2020 11:41
Program in a loop
package ioleo.tictactoe
import ioleo.tictactoe.app.RunLoop
import ioleo.tictactoe.domain.{ConfirmAction, ConfirmMessage, MenuMessage, State}
import zio.{Managed, ZIO}
import zio.clock.Clock
import zio.duration._
import zio.test.{assertM, suite, testM, DefaultRunnableSpec}
import zio.test.Assertion.{equalTo, isRight, isSome, isUnit}
import zio.test.mock.Expectation.{failure, value}
@dariathecracker
dariathecracker / ioleo.tictactoe.scala
Last active June 4, 2020 11:41
Boilerplate machinery
import zio.test.mock.{Method, Mock, Mockable}
object MockConsole {
// ...
object putStr extends Method[MockConsole, String, Unit]
object putStrLn extends Method[MockConsole, String, Unit]
object getStrLn extends Method[MockConsole, Unit, String]
implicit val mockable: Mockable[MockConsole] = (mock: Mock) =>
import zio.test.mock.Expectation.{unit, value}
val mock: Managed[Nothing, MockConsole] = (
(MockConsole.getStrLn returns value("first")) *>
(MockConsole.getStrLn returns value("second")) *>
(MockConsole.putStrLn(equalTo("first & second")) returns unit)
)
@dariathecracker
dariathecracker / ioleo.tictactoe.scala
Last active June 4, 2020 11:42
Mock implementation of service
package ioleo.tictactoe.cli
import zio.Managed
import zio.test.{assertM, checkM, suite, testM, DefaultRunnableSpec, Gen}
import zio.test.Assertion.equalTo
import zio.test.mock.Expectation.value
import zio.test.mock.MockConsole
import TerminalSpecUtils._
@dariathecracker
dariathecracker / ioleo.tictactoe.scala
Last active June 4, 2020 11:42
`Console` service in `TerminalLive`
package ioleo.tictactoe.cli
import zio.console.Console
trait TerminalLive extends Terminal {
val console: Console.Service[Any]
final val terminal = new Terminal.Service[Any] {
@dariathecracker
dariathecracker / ioleo.tictactoe.scala
Last active June 4, 2020 11:42
Clearing the console
package ioleo.tictactoe.cli
import zio.ZIO
import zio.macros.annotation.{accessible, mockable}
@accessible(">")
@mockable
trait Terminal {
val terminal: Terminal.Service[Any]
def parse(input: String): UIO[MenuCommand] =
UIO.succeed(input) map {
case "new game" => MenuCommand.NewGame
case "resume" => MenuCommand.Resume
case "quit" => MenuCommand.Quit
case _ => MenuCommand.Invalid
}