Testing out JmonkeyEngine to make a game in Scala with Akka Actors within a pure FP layer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.8 KiB

3 years ago
  1. package wow.doge.mygame.implicits
  2. import cats.data.Kleisli
  3. import monix.bio.IO
  4. import monix.bio.UIO
  5. import cats.effect.Resource
  6. import cats.Functor
  7. import cats.effect.Bracket
  8. import monix.bio.Task
  9. import cats.Show
  10. import cats.syntax.show._
  11. trait CatsExtensions {
  12. implicit class KleisliCompanionExt(k: Kleisli.type) {
  13. def io[S, E, A](f: S => IO[E, A]): Kleisli[UIO, S, Either[E, A]] =
  14. k.apply(s => f(s).attempt)
  15. }
  16. implicit class KleisliExt[S, E, A](k: Kleisli[UIO, S, Either[E, A]]) {
  17. def runIO(s: S) = k.run(s).rethrow
  18. }
  19. implicit class ResourceCompanionExt(r: Resource.type) {
  20. // def ioMake[UIO, R](acquire: )(release: ) = r.make()()
  21. def ioMake[E: Show, A](
  22. acquire: IO[E, A]
  23. )(
  24. release: A => UIO[Unit]
  25. )(implicit F: Functor[UIO]): Resource[UIO, Either[E, A]] =
  26. r.make(acquire.attempt)(a =>
  27. IO.fromEither(a)
  28. .onErrorHandleWith(err => IO.terminate(new Exception(err.show)))
  29. .flatMap(release)
  30. )
  31. val acq = IO(1).onErrorHandleWith(_ => IO.raiseError(""))
  32. val res =
  33. ioMake(acq)(_ => IO.unit)
  34. val result = res
  35. .use {
  36. case Left(value) => Task(Left(value))
  37. case Right(value) => Task(Right(value))
  38. }
  39. .hideErrors
  40. .rethrow
  41. // IO.unit.bracket()
  42. }
  43. implicit class ResourceExt[E, A](k: Resource[UIO, Either[E, A]]) {
  44. // def runIO(s: S) = k.run(s).rethrow
  45. // k.use
  46. // : IO[E, B]
  47. // def useIO[B](f: Either[E, A] => IO[E, B]) =
  48. // k.use(f).rethrow
  49. // type test[A] = Tuple2[*, Double]
  50. type IoResource[X, D] = Resource[IO[X, *], D]
  51. val x: Resource[IO[String, *], String] =
  52. Resource.make(IO.raiseError(""))(_ => IO.unit)
  53. // x.use(s => Task.unit)
  54. val x2: IoResource[String, String] =
  55. Resource.make(UIO(""))(_ => IO.unit)
  56. }
  57. }