Skip to content

Instantly share code, notes, and snippets.

@jasonmartens
Last active June 15, 2019 17:10
Show Gist options
  • Save jasonmartens/f846730f170020dc16a3e3aa489886b7 to your computer and use it in GitHub Desktop.
Save jasonmartens/f846730f170020dc16a3e3aa489886b7 to your computer and use it in GitHub Desktop.
import scalaz.nio._
import scalaz.nio.channels.{AsynchronousServerSocketChannel, AsynchronousSocketChannel}
import scalaz.zio.clock.Clock
import scalaz.zio.console._
import scalaz.zio.{App, ZIO}
object Main extends App {
override def run(args: List[String]): ZIO[Environment, Nothing, Int] =
myAppLogic
.either
.map(_.fold(e => { e.printStackTrace(); 1 }, _ => 0))
val myAppLogic: ZIO[Clock with Console, Exception, Unit] = {
SocketAddress.inetSocketAddress(1337).map{ addr =>
AsynchronousServerSocketChannel().map { socket =>
socket.bind(addr)
socket
}.bracket(_.close) { socket =>
socket.accept.bracket(_.close) { conn =>
doWork(conn).fork
}.forever
}
}
}
def doWork(work: AsynchronousSocketChannel): ZIO[Console, Exception, Unit] = {
for {
chunk <- work.read(16)
str = chunk.toArray.map(_.toChar).mkString
_ <- putStrLn("content: " + str)
} yield ()
}
}
@jasonmartens
Copy link
Author

jasonmartens commented Jun 15, 2019

Gives an error when compiling:

Error:(18, 19) type mismatch;
 found   : scalaz.zio.IO[Exception,Unit]
    (which expands to)  scalaz.zio.ZIO[Any,Exception,Unit]
 required: scalaz.zio.ZIO[?, Nothing, _]
      }.bracket(_.close) { socket =>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment