|
1 | 1 | package training
|
2 | 2 |
|
| 3 | +import cats.{Id, Monad} |
3 | 4 | import cats.implicits._
|
| 5 | +import scala.concurrent.Future |
| 6 | +import scala.concurrent.ExecutionContext.Implicits.global |
| 7 | +import scala.util.Try |
4 | 8 |
|
5 |
| -object Program extends App { |
| 9 | +class MyProgram[F[_]: Monad] extends App { |
6 | 10 |
|
7 | 11 | case class Account(id: String, balance: Int)
|
8 | 12 | case class Statement(isRich: Boolean, accounts: Int)
|
9 | 13 |
|
10 |
| - def getBank1Credentials: Option[String] = Some("MyUser_MyPassword") |
| 14 | + def getBank1Credentials: F[String] = "MyUser_MyPassword".pure[F] |
11 | 15 |
|
12 |
| - def getBalanceBank1(credentials: String): Option[Account] = Some(Account("a1", 100)) |
| 16 | + def getBalanceBank1(credentials: String): F[Account] = Account("a1", 100).pure[F] |
13 | 17 |
|
14 |
| - def getBalanceBank2: Option[Int] = Some(80) |
| 18 | + def getBalanceBank2: F[Int] = 80.pure[F] |
15 | 19 |
|
16 | 20 | val moneyInPocket: Int = 20
|
17 | 21 |
|
18 |
| - def balance: Option[Int] = for { |
| 22 | + def balance: F[Int] = for { |
19 | 23 | c <- getBank1Credentials
|
20 | 24 | b1 <- getBalanceBank1(c).map(_.balance)
|
21 | 25 | b2 <- getBalanceBank2
|
22 |
| - p <- moneyInPocket.pure[Option] |
| 26 | + p <- moneyInPocket.pure[F] |
23 | 27 | } yield b1 + b2 + p
|
24 | 28 |
|
| 29 | +} |
| 30 | + |
| 31 | +object Program extends App { |
| 32 | + |
| 33 | + type EitherS[A] = Either[String, A] |
25 | 34 |
|
26 | 35 | //EDGE OF THE WORLD
|
27 |
| - println(balance) |
| 36 | + println(new MyProgram[Id].balance) |
| 37 | + println(new MyProgram[EitherS].balance) |
| 38 | + println(new MyProgram[Option].balance) |
| 39 | + println(new MyProgram[Try].balance) |
| 40 | + println(new MyProgram[List].balance) |
| 41 | + println(new MyProgram[Future].balance) |
28 | 42 |
|
29 | 43 | }
|
30 |
| - |
|
0 commit comments