Guest User

Untitled

a guest
May 20th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. import cats.syntax.all._
  2. import cats.effect.IO
  3.  
  4. sealed trait Memo[A] {
  5. def get: IO[A]
  6. }
  7. object Memo {
  8. def make[A](a: => IO[A]): Memo[A] = new Memo[A] {
  9. @volatile var cache: Option[A] = None
  10.  
  11. def get: IO[A] = IO {
  12. cache match {
  13. case None =>
  14. a.flatMap { r =>
  15. IO { cache = Some(r); r }
  16. }
  17. case Some(x) =>
  18. IO.pure(x)
  19. }
  20. }.flatten
  21. }
  22. }
  23.  
  24. val impure: IO[Int] = IO { println("impure"); 10 }
  25.  
  26. val a = Memo.make(impure)
  27. (a.get *> a.get).unsafeRunSync // prints once
  28.  
  29. // inline
  30. (Memo.make(impure).get *> Memo.make(impure).get).unsafeRunSync // prints twice
  31.  
  32. (for {
  33. r <- IORef.make[Int](0)
  34. impure = for {
  35. v <- r.get
  36. _ <- r.set(v + 1)
  37. } yield ()
  38.  
  39. a = Memo.make(impure)
  40. _ <- a.get *> a.get
  41. v <- r.get
  42. _ <- IO { println(v) }
  43. } yield ()).unsafeRunSync // prints 1
  44.  
  45. (for {
  46. r <- IORef.make[Int](0)
  47. impure = for {
  48. v <- r.get
  49. _ <- r.set(v + 1)
  50. } yield ()
  51. // all I did was inline a
  52. _ <- Memo.make(impure).get *> Memo.make(impure).get
  53. v <- r.get
  54. _ <- IO { println(v) }
  55. } yield ()).unsafeRunSync // prints 2
  56.  
  57. /////////////////////////////////////////////////////////////////////////////////
  58. /////////////////////////////////////////////////////////////////////////////////
  59. /////////////////////////////////////////////////////////////////////////////////
  60.  
  61. sealed trait IORef[A] {
  62. def get: IO[A]
  63. def set(a: A): IO[Unit]
  64. }
  65. object IORef {
  66. def make[A](a: A): IO[IORef[A]] = IO {
  67. new IORef[A] {
  68. var value: A = a
  69. def get: IO[A] = IO { value }
  70. def set(a: A): IO[Unit] = IO { value = a }
  71. }
  72. }
  73. }
Add Comment
Please, Sign In to add comment