├── src
├── main
│ ├── scala
│ │ ├── immutable
│ │ │ ├── README.md
│ │ │ ├── AccountMutable.scala
│ │ │ └── AccountImmutable.scala
│ │ ├── kamil
│ │ │ └── Kamil.scala
│ │ ├── combinators
│ │ │ ├── README.md
│ │ │ └── ContactInfo.scala
│ │ ├── encapsulation
│ │ │ ├── oop
│ │ │ │ └── Unit.scala
│ │ │ ├── unit
│ │ │ │ ├── DistanceMiles.scala
│ │ │ │ ├── TimeUnit.scala
│ │ │ │ ├── SpeedUnit.scala
│ │ │ │ ├── Formulas.scala
│ │ │ │ └── DistanceUnit.scala
│ │ │ ├── README.md
│ │ │ └── EncapsulationApp.scala
│ │ ├── nomock
│ │ │ ├── user
│ │ │ │ ├── Failure.scala
│ │ │ │ ├── Check.scala
│ │ │ │ └── API.scala
│ │ │ └── app
│ │ │ │ └── UserCreation.scala
│ │ ├── cbt
│ │ │ ├── BuildS.scala
│ │ │ └── Build.scala
│ │ ├── fizzbuzz
│ │ │ └── FizzBuzz.scala
│ │ ├── com
│ │ │ └── example
│ │ │ │ ├── Icon.scala
│ │ │ │ ├── Fibonacci.scala
│ │ │ │ ├── Stack.scala
│ │ │ │ ├── SymbolicExpressions.scala
│ │ │ │ ├── CakeDI.scala
│ │ │ │ ├── Composition.scala
│ │ │ │ ├── Symbolic.scala
│ │ │ │ ├── OoDI.scala
│ │ │ │ └── FuncDI.scala
│ │ ├── url_shortener
│ │ │ └── UrlShortener.scala
│ │ ├── ddd
│ │ │ ├── ErrorAPI.scala
│ │ │ ├── ErrorMessages.scala
│ │ │ ├── PaymentAPI.scala
│ │ │ ├── ShoppingCartConfig.scala
│ │ │ ├── Directives.scala
│ │ │ ├── ShoppingCartAPI.scala
│ │ │ ├── Validation.scala
│ │ │ ├── SampleData.scala
│ │ │ ├── Commons.scala
│ │ │ ├── ShoppingCartApp.scala
│ │ │ └── ShoppingCart.scala
│ │ ├── plainFP
│ │ │ ├── Roman.scala
│ │ │ ├── Table.scala
│ │ │ ├── Domain.scala
│ │ │ ├── WiredLogger.scala
│ │ │ ├── MonadLogger.scala
│ │ │ ├── Logger.scala
│ │ │ ├── Config.scala
│ │ │ ├── SimpleImp.scala
│ │ │ ├── SimpleCommon.scala
│ │ │ ├── SimpleFP.scala
│ │ │ └── RequestResponse.scala
│ │ ├── control
│ │ │ ├── ForOO.scala
│ │ │ └── For.scala
│ │ ├── zio
│ │ │ ├── MyApp.scala
│ │ │ └── Fibonacci.scala
│ │ ├── tdd
│ │ │ └── RequestResponse.scala
│ │ ├── shape
│ │ │ ├── CalculatorPF.scala
│ │ │ ├── Shape.scala
│ │ │ └── ShapeSimple.scala
│ │ ├── bird
│ │ │ └── Bird.scala
│ │ ├── colossus
│ │ │ └── Akka.scala
│ │ ├── tank
│ │ │ └── Tank.scala
│ │ ├── queens
│ │ │ └── Queens.scala
│ │ ├── family
│ │ │ └── Family.scala
│ │ ├── licit
│ │ │ └── Licit.scala
│ │ ├── supervisor
│ │ │ └── Main.scala
│ │ ├── lnko
│ │ │ └── Lnko.scala
│ │ ├── rest
│ │ │ └── RestApi.scala
│ │ ├── tight
│ │ │ └── TightCoupling.scala
│ │ ├── ebi
│ │ │ └── Store.scala
│ │ ├── independence
│ │ │ ├── ResultOps.scala
│ │ │ ├── Logger.scala
│ │ │ └── Result.scala
│ │ ├── log
│ │ │ └── Analyzer.scala
│ │ ├── knapsack
│ │ │ └── Knapsack.scala
│ │ └── loopperf
│ │ │ └── NBodyArray.scala
│ ├── resources
│ │ ├── index.html
│ │ ├── comments.json
│ │ ├── comment.hbs
│ │ └── fak
│ │ │ ├── index.html
│ │ │ ├── css
│ │ │ └── main.css
│ │ │ └── js
│ │ │ └── main.js
│ └── java
│ │ ├── fpjdbc
│ │ ├── ThrowingConsumer.java
│ │ ├── ThrowingFunction.java
│ │ ├── FpJdbc.java
│ │ └── Record.java
│ │ ├── IntOperation.java
│ │ ├── handlebars
│ │ └── Handlebars.java
│ │ ├── exception
│ │ ├── Either.java
│ │ ├── Tuple2.java
│ │ ├── Calc.java
│ │ ├── CalcEither.java
│ │ ├── Right.java
│ │ ├── Left.java
│ │ └── Failure.java
│ │ ├── log
│ │ ├── Server.java
│ │ ├── App.java
│ │ └── Logger.java
│ │ ├── SecurityListing.java
│ │ ├── Color.java
│ │ ├── independence
│ │ ├── TightCoupling.java
│ │ ├── TightAndIndependentCoupling.java
│ │ └── LooseCoupling.java
│ │ ├── total
│ │ ├── NotZeroInt.java
│ │ ├── Pair.java
│ │ └── Total.java
│ │ ├── DecimalFormat.java
│ │ ├── fp
│ │ └── Either.java
│ │ ├── cart
│ │ ├── ShoppingCart.java
│ │ └── ShoppingCartImpl.java
│ │ ├── BufReadMulti.java
│ │ ├── PP.java
│ │ ├── builder
│ │ └── Contact.java
│ │ ├── OccurenceOfLetters.java
│ │ └── threads
│ │ └── README.md
└── test
│ └── scala
│ ├── family
│ └── FamilySpec.scala
│ ├── plainFP
│ ├── LoggerBench.scala
│ └── RequestResponseSpec.scala
│ ├── queens
│ └── QueensSpec.scala
│ ├── tdd
│ └── WebServerSpec.scala
│ ├── shape
│ ├── ShapeSpec.scala
│ ├── ShapePFSpec.scala
│ ├── ShapeSimpleSpec.scala
│ └── ShapeOOSpec.scala
│ ├── nomock
│ ├── user
│ │ └── Infra.scala
│ └── app
│ │ └── UserCreationSpec.scala
│ ├── loopperf
│ └── NBodyArrayPerf.scala
│ └── independence
│ └── IndependenceDaySpec.scala
├── activator-launch-1.3.2.jar
├── project
├── plugins.sbt
└── build.properties
├── README.md
└── .gitignore
/src/main/scala/immutable/README.md:
--------------------------------------------------------------------------------
1 | # Immutable vs mutable
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/main/resources/index.html:
--------------------------------------------------------------------------------
1 |
2 | Hello
3 |
4 |
--------------------------------------------------------------------------------
/activator-launch-1.3.2.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/enpassant/miniatures/HEAD/activator-launch-1.3.2.jar
--------------------------------------------------------------------------------
/project/plugins.sbt:
--------------------------------------------------------------------------------
1 | addSbtPlugin("org.scoverage" %% "sbt-scoverage" % "1.5.1")
2 | addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.5")
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # miniatures
2 |
3 | Miniature scala sources
4 |
5 | ## Symbolic.scala
6 |
7 | Sample symbolic programming with traits, case classes and objects.
8 |
--------------------------------------------------------------------------------
/project/build.properties:
--------------------------------------------------------------------------------
1 | #Activator-generated Properties
2 | #Tue Jun 30 17:13:53 CEST 2015
3 | template.uuid=7faf8e1e-4e8d-4387-8159-642b50383096
4 | sbt.version=1.4.2
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /RUNNING_PID
2 | /logs/
3 | /project/*-shim.sbt
4 | /project/project/
5 | /project/target/
6 | /target/
7 | /out/
8 | .metals/
9 | .bloop/
10 | .bsp/
11 | .scalafmt.conf
12 |
--------------------------------------------------------------------------------
/src/main/java/fpjdbc/ThrowingConsumer.java:
--------------------------------------------------------------------------------
1 | package fpjdbc;
2 |
3 | @FunctionalInterface
4 | public interface ThrowingConsumer {
5 | void accept(T t) throws E;
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/java/fpjdbc/ThrowingFunction.java:
--------------------------------------------------------------------------------
1 | package fpjdbc;
2 |
3 | @FunctionalInterface
4 | public interface ThrowingFunction {
5 | R apply(T t) throws E;
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/scala/kamil/Kamil.scala:
--------------------------------------------------------------------------------
1 | object Kamil extends App {
2 | val stream = Stream.continually(scala.io.StdIn.readLine).foldLeft(1)(
3 | (x,c)=>if("FLDT".contains(c)) x*2 else x)
4 | println(stream)
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/scala/combinators/README.md:
--------------------------------------------------------------------------------
1 | [Use lambdas and combinators to improve your API](http://blog.leifbattermann.de/2017/09/05/use-lambdas-and-combinators-to-improve-your-api/)
2 |
3 | (or use partial functions instead of combinators)
4 |
--------------------------------------------------------------------------------
/src/main/scala/encapsulation/oop/Unit.scala:
--------------------------------------------------------------------------------
1 | package encapsulation.oop
2 |
3 | class Unit private[oop](
4 | private[oop] val value: Double,
5 | private[oop] val unit: String
6 | ) {
7 | override def toString(): String = s"$value $unit"
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/scala/encapsulation/unit/DistanceMiles.scala:
--------------------------------------------------------------------------------
1 | package encapsulation.unit
2 |
3 | import DistanceUnit._
4 |
5 | object DistanceMiles {
6 | def createMile(mile: Double): Distance = new Distance(mile * 1609.344)
7 |
8 | def asMile(distance: Distance): Double = distance.meter * 0.00062137119224
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/scala/nomock/user/Failure.scala:
--------------------------------------------------------------------------------
1 | package nomock.user
2 |
3 | import scala.util.{Either, Left, Right}
4 |
5 | object Failure {
6 | trait Error {
7 | def message: String
8 | }
9 |
10 | case class BusinessError(message: String) extends Error
11 | case class InfrastructureError(message: String) extends Error
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/scala/cbt/BuildS.scala:
--------------------------------------------------------------------------------
1 | import shapeless._ ; import syntax.singleton._ ; import record._
2 |
3 | object BuildS {
4 | val build =
5 | ("x" ->> 5) ::
6 | ("y" ->> 6) ::
7 | ("z" ->> (() => 5)) ::
8 | ("zz" ->> (() => 5)) ::
9 | HNil
10 |
11 | val build2 = build + ("z" ->> (() => build("x") + build("y")))
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/scala/encapsulation/unit/TimeUnit.scala:
--------------------------------------------------------------------------------
1 | package encapsulation.unit
2 |
3 | class Time private[unit](private[unit] val second: Double)
4 |
5 | object TimeUnit {
6 | def createTime(second: Double): Time = new Time(second)
7 |
8 | def asHour(time: Time): Double = time.second / 60
9 | def asSecond(time: Time): Double = time.second
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/scala/fizzbuzz/FizzBuzz.scala:
--------------------------------------------------------------------------------
1 | package fizzbuzz
2 |
3 | object Fizzbuzz extends App {
4 | val factors = Map(3 -> "Fizz", 5 -> "Buzz", 2 -> "Baxx")
5 | val result = (1 to 30) map { i =>
6 | factors
7 | .filter(x => i % x._1 == 0)
8 | .map(_._2)
9 | .reduceOption(_ + _)
10 | .getOrElse(i)
11 | }
12 | println(result)
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/scala/encapsulation/unit/SpeedUnit.scala:
--------------------------------------------------------------------------------
1 | package encapsulation.unit
2 |
3 | class Speed private[unit](private[unit] val mps: Double)
4 |
5 | object SpeedUnit {
6 | def createSpeed(mps: Double): Speed = new Speed(mps)
7 |
8 | def createKph(kph: Double): Speed = new Speed(kph / 3.6)
9 |
10 | def asMps(speed: Speed): Double = speed.mps
11 | def asKph(speed: Speed): Double = speed.mps * 3.6
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/scala/encapsulation/unit/Formulas.scala:
--------------------------------------------------------------------------------
1 | package encapsulation.unit
2 |
3 | object Formulas {
4 | def calcSpeed(distance: Distance, time: Time): Speed =
5 | new Speed(distance.meter / time.second)
6 | def calcTime(distance: Distance, speed: Speed): Time =
7 | new Time(distance.meter / speed.mps)
8 | def calcDistance(speed: Speed, time: Time): Distance =
9 | new Distance(speed.mps * time.second)
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/scala/com/example/Icon.scala:
--------------------------------------------------------------------------------
1 | package com.example
2 |
3 | import scala.language.implicitConversions
4 |
5 | case class IntValue(x: Int) {
6 | def less(b: Int): Option[Int] =
7 | if (x < b) Some(b) else None
8 | }
9 |
10 | object Icon extends App {
11 | implicit def int2Integer(x: Int) = IntValue(x)
12 | val x = 8
13 | println(
14 | for {
15 | expr <- 2 less x
16 | } yield (expr * 2)
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/scala/encapsulation/unit/DistanceUnit.scala:
--------------------------------------------------------------------------------
1 | package encapsulation.unit
2 |
3 | class Distance private[unit](private[unit] val meter: Double)
4 |
5 | object DistanceUnit {
6 | def createDistance(meter: Double): Distance = new Distance(meter)
7 |
8 | def createKm(km: Double): Distance = new Distance(km * 1000)
9 |
10 | def asMeter(distance: Distance): Double = distance.meter
11 | def asKm(distance: Distance): Double = distance.meter / 1000
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/scala/encapsulation/README.md:
--------------------------------------------------------------------------------
1 | # Egységbezárás
2 |
3 | Az egységbe zárás azt fejezi ki, hogy az összetartozó adatok és függvények, eljárások együtt vannak, egy egységbe tartoznak. További fontos fogalom az adatelrejtés, ami azt jelenti, hogy kívülről csak az férhető hozzá közvetlenül, amit az objektum osztálya megenged. Ez fontos ahhoz, hogy megelőzze a nem kívánt kapcsolatok kialakulását, megkönnyítse a kód értelmezését, és elkerülje az adatok ellenőrizetlen terjedését (lásd objektumtobzódás).
4 |
--------------------------------------------------------------------------------
/src/main/resources/comments.json:
--------------------------------------------------------------------------------
1 | {
2 | "_id": 5,
3 | "comments": [
4 | {
5 | "commentId": 7,
6 | "userName": "John",
7 | "content": "Test comment 1
",
8 | "comments": [
9 | {
10 | "commentId": "8",
11 | "userName": "Susan",
12 | "content": "Reply
"
13 | }]
14 | },
15 | {
16 | "commentId": "9",
17 | "userName": "George",
18 | "content": "Test comment 2
"
19 | }
20 | ]}";
21 |
22 |
--------------------------------------------------------------------------------
/src/main/scala/nomock/user/Check.scala:
--------------------------------------------------------------------------------
1 | package nomock.user
2 |
3 | import scala.util.{Either, Left, Right}
4 |
5 | object Check {
6 | import API._
7 | import Failure._
8 |
9 | val invalidLoginInfo = BusinessError("username or password is empty")
10 |
11 | def checkUserLogin(userName: String, password: String): Either[Error, Login] = {
12 | if (userName == "" || password == "") {
13 | Left(invalidLoginInfo)
14 | } else {
15 | Right(new Login(userName, password))
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/scala/url_shortener/UrlShortener.scala:
--------------------------------------------------------------------------------
1 | package url_shortener
2 |
3 | import java.util.Base64
4 | import scala.math.BigInt
5 | import scala.util.Random
6 |
7 | object UrlShortener extends App {
8 | (1000000001 to 1000000010) map {
9 | i => i ^ 0x3a75dc68
10 | } map {
11 | i => new Random(147).shuffle(i.toBinaryString.toList)
12 | } map {
13 | s => Integer.parseInt(s.mkString, 2)
14 | } map {
15 | i => Base64.getEncoder.encodeToString(BigInt(i).toByteArray)
16 | } foreach println
17 | }
18 |
19 |
--------------------------------------------------------------------------------
/src/main/scala/ddd/ErrorAPI.scala:
--------------------------------------------------------------------------------
1 | package ddd
2 |
3 | import Types._
4 | import PaymentAPI._
5 | import ShoppingCartAPI._
6 |
7 | object ErrorAPI {
8 | case class ItemAlreadyAdded(item: Item) extends Error
9 | case class NoItemInCart(item: Item) extends Error
10 | case class CardProcessFailure(card: Card) extends Error
11 |
12 | case class UnknownCommand(state: State, command: Command) extends Error
13 | case class UnknownEvent(state: State, event: Event) extends Error
14 | case class UnknownCapability(state: State, command: Command) extends Error
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/scala/plainFP/Roman.scala:
--------------------------------------------------------------------------------
1 | package plainFP
2 |
3 | object Roman extends App {
4 | val romanNumber = "MCMLXIX"
5 | val digit = List('I', 'V', 'X', 'L', 'C', 'D', 'M')
6 | val digitValue = List(1, 5, 10, 50, 100, 500, 1000)
7 | val indexes = romanNumber.map(ch => digit.indexOf(ch))
8 |
9 | val pairs = indexes.zip(indexes.drop(1) :+ 0)
10 | val values = pairs.map(pair =>
11 | if (pair._1 >= pair._2)
12 | digitValue(pair._1)
13 | else
14 | -digitValue(pair._1))
15 | val arab = values.sum
16 | println("Arab: " + arab)
17 | }
18 |
--------------------------------------------------------------------------------
/src/test/scala/family/FamilySpec.scala:
--------------------------------------------------------------------------------
1 | package family
2 |
3 | import org.scalatest._
4 |
5 | class FamilySpec extends FunSpec with Matchers {
6 | import Family._
7 |
8 | describe("Family. Husband") {
9 | it("should greet anyone formally") {
10 | val moduls = List.empty[Modul]
11 | val greet = composeGreet(moduls)
12 | greet(Husband, Albert) shouldBe "How do you do!"
13 | }
14 | it("should greet his friends") {
15 | val moduls = List(HusbandModul)
16 | val greet = composeGreet(moduls)
17 | greet(Husband, Albert) shouldBe "Hey budd!"
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/test/scala/plainFP/LoggerBench.scala:
--------------------------------------------------------------------------------
1 | package plainFP
2 |
3 | import org.scalameter.api._
4 | import plainFP._
5 |
6 | object LoggerBench extends Bench.ForkedTime {
7 | val ranges = for {
8 | size <- Gen.range("size")(20000, 100000, 20000)
9 | } yield 0 until size
10 |
11 | performance of "MonadLogger" in {
12 | measure method "main" in {
13 | using(ranges) in {
14 | _.map(i => MonadLogger.main(Array("-t")))
15 | }
16 | }
17 | }
18 |
19 | performance of "Logger" in {
20 | measure method "main" in {
21 | using(ranges) in {
22 | _.map(i => Logger.main(Array("-t")))
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/IntOperation.java:
--------------------------------------------------------------------------------
1 | public class IntOperation {
2 | private static int add(int a, int b) {
3 | return a + b;
4 | }
5 |
6 | private static int mul(int a, int b) {
7 | return a * b;
8 | }
9 |
10 | @FunctionalInterface
11 | interface Operation {
12 | int apply(int a, int b);
13 | }
14 |
15 | public static int run(Operation operation, int a, int b) {
16 | return operation.apply(a, b);
17 | }
18 |
19 | public static void main(String[] args) {
20 | //int result = run(DecimalFormat::add, 10, 14);
21 | int result = run((a, b) -> a * b, 10, 14);
22 | System.out.println("Result: " + result);
23 | }
24 | }
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/src/main/scala/control/ForOO.scala:
--------------------------------------------------------------------------------
1 | package control
2 |
3 | trait For[S] {
4 | def init: S
5 | def predicate(s: S): Boolean
6 | def step(s: S): S
7 | def core(s: S)
8 |
9 | def run() = {
10 | def loop(state: S): Unit = {
11 | if (predicate(state)) {
12 | core(state)
13 | val nextState = step(state)
14 | loop(nextState)
15 | }
16 | }
17 | loop(init)
18 | }
19 | }
20 |
21 | object ForOOApp extends App {
22 | val data = List(1, 3, 5, 7, 8, 4, 9)
23 | (new For[Int] {
24 | def init = 0
25 | def predicate(state: Int) = state < data.length
26 | def step(state: Int) = state + 1
27 | def core(state: Int) = {
28 | println(data(state))
29 | }
30 | }).run()
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/scala/com/example/Fibonacci.scala:
--------------------------------------------------------------------------------
1 | package com.example
2 |
3 | object Fibonacci extends App {
4 | def fibonacci(n: Int) = {
5 | def fib(current: Int, next: Int, index: Int): Int = {
6 | if (index <= 1) next
7 | else fib(next, current + next, index - 1)
8 | }
9 | fib(0, 1, n)
10 | }
11 |
12 | def tribonacci(n: Int) = {
13 | def trib(v1: Int, v2: Int, v3: Int, index: Int): Int = {
14 | if (index <= 1) v3
15 | else trib(v2, v3, v1 + v2 + v3, index - 1)
16 | }
17 | trib(0, 1, 1, n)
18 | }
19 |
20 | println(
21 | (1 to 10) map { n =>
22 | s"fibonacci($n)=${fibonacci(n)}"
23 | }
24 | )
25 |
26 | println(
27 | (1 to 10) map { n =>
28 | s"tribonacci($n)=${tribonacci(n)}"
29 | }
30 | )
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/scala/control/For.scala:
--------------------------------------------------------------------------------
1 | package control
2 |
3 | object ForFP {
4 | def forFn[S](
5 | init: S,
6 | predicate: S => Boolean,
7 | step: S => S,
8 | core: S => Unit
9 | ) = {
10 | def loop(state: S): Unit = {
11 | if (predicate(state)) {
12 | core(state)
13 | val nextState = step(state)
14 | loop(nextState)
15 | }
16 | }
17 | loop(init)
18 | }
19 | }
20 |
21 | object ForApp extends App {
22 | val data = List(1, 3, 5, 7, 8, 4, 9)
23 | ForFP.forFn[Int](0, _ < data.length, _ + 1, i => {
24 | println(data(i))
25 | })
26 |
27 | def forRange(s: Int, n: Int) =
28 | ForFP.forFn[Int](s, _ < n, _ + 1, _)
29 |
30 | forRange(0, data.length) { i =>
31 | println(data(i))
32 | }
33 |
34 | data.foreach(println)
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/scala/zio/MyApp.scala:
--------------------------------------------------------------------------------
1 | package zio
2 |
3 | import zio.{App, ExitCode, IO, random}
4 | import zio.blocking.effectBlocking
5 | import zio.console._
6 |
7 | import java.io.IOException
8 |
9 | object MyApp extends App {
10 |
11 | def run(args: List[String]) =
12 | myAppLogic.fold(_ => ExitCode(1), _ => ExitCode(0))
13 |
14 | val finalizer = IO.effectTotal(println("Sleep interrupted"))
15 |
16 | def myAppLogic =
17 | for {
18 | r <- random.nextInt
19 | fiber <- effectBlocking({ Thread.sleep(5000); r})
20 | .ensuring(finalizer)
21 | .fork
22 | _ <- putStrLn("Hello! What is your name?")
23 | n <- getStrLn
24 | _ <- putStrLn("Hello " + n + ", good to meet you!")
25 | v <- fiber.interrupt
26 | _ <- putStrLn("Value: " + v)
27 | } yield ()
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/scala/ddd/ErrorMessages.scala:
--------------------------------------------------------------------------------
1 | package ddd
2 |
3 | import Types._
4 | import PaymentAPI._
5 | import ErrorAPI._
6 |
7 | object ErrorMessages {
8 | def toMessage(error: Failure) = error match {
9 | case ItemAlreadyAdded(item) =>
10 | s"${item} is already added!"
11 | case NoItemInCart(item) =>
12 | s"There is no ${item} in the cart!"
13 | case CardProcessFailure(card) =>
14 | s"There was a problem processing your $card card!"
15 |
16 | case UnknownCommand(state, command) =>
17 | s"Unknown $command command for $state state!"
18 | case UnknownEvent(state, event) =>
19 | s"Unknown $event event for $state state!"
20 | case UnknownCapability(state, command) =>
21 | s"Unknown capability /$command command for $state state/!"
22 |
23 | case _ => error.toString
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/scala/plainFP/Table.scala:
--------------------------------------------------------------------------------
1 | package plainFP
2 |
3 | object TableAPI {
4 | case class Table(rows: Vector[Row])
5 | case class Row(cells: Vector[Cell])
6 | case class Cell(value: String)
7 |
8 | val table = (init: Table => Table) => {
9 | val t = Table(Vector())
10 | init(t)
11 | }
12 |
13 | val row = (init: Row => Row) => (t: Table) => {
14 | val r = Row(Vector())
15 | Table(t.rows :+ init(r))
16 | }
17 |
18 | val cell = (str: String) => (r: Row) => {
19 | Row(r.cells :+ Cell(str))
20 | }
21 | }
22 |
23 | object TableApp extends App {
24 | import TableAPI._
25 |
26 | val t = table {
27 | row {
28 | cell("top left") andThen
29 | cell("top right")
30 | } andThen
31 | row {
32 | cell("bottom left") andThen
33 | cell("bottom right")
34 | }
35 | }
36 |
37 | println(t)
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/scala/tdd/RequestResponse.scala:
--------------------------------------------------------------------------------
1 | package tdd
2 |
3 | import scala.util.Random
4 |
5 | object Method extends Enumeration {
6 | type Method = Value
7 | val GET, HEAD, POST, PUT, DELETE, PATCH = Value
8 | }
9 | import Method._
10 |
11 | case class Response(
12 | code: Int,
13 | contentType: String,
14 | content: String
15 | )
16 |
17 | case class Order(id: String, rows: List[OrderRow])
18 |
19 | case class OrderRow(id: String, price: Double)
20 |
21 | object Database {
22 | def getOrder(id: String): Option[Order] = {
23 | //Thread.sleep(2000)
24 | if (id == "15") {
25 | Some(Order(id, List(OrderRow("1", 10000.0), OrderRow("2", 17456.0))))
26 | } else if (Random.nextBoolean) {
27 | Some(Order(id, List(
28 | OrderRow("1", Random.nextDouble),
29 | OrderRow("2", Random.nextDouble))))
30 | } else None
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/scala/shape/CalculatorPF.scala:
--------------------------------------------------------------------------------
1 | package shape
2 |
3 | object CalculatorPF extends App {
4 | def literal(v: Double): Double = v
5 | def add(a: Double, b: Double): Double = a + b
6 |
7 | def literalPP(v: Double) = { println(s"$v"); v }
8 | def addPP(a: Double, b: Double) = { println(s"$a + $b"); a + b }
9 |
10 | case class Calculator[T](
11 | literal: T => T,
12 | add: (T, T) => T
13 | )
14 |
15 | val doubleCalculator = Calculator(literal, add)
16 | val ppCalculator = Calculator(literalPP, addPP)
17 |
18 | def calc[T](expression: Calculator[T] => T)(calculator: Calculator[T]) = {
19 | expression(calculator)
20 | }
21 |
22 | val expression = calc[Double] { c =>
23 | val la = c.literal(10.2)
24 | val lb = c.literal(1.5)
25 | c.add(la, lb)
26 | } _
27 |
28 | println(expression(doubleCalculator))
29 | expression(ppCalculator)
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/scala/bird/Bird.scala:
--------------------------------------------------------------------------------
1 | object Duck {
2 | def Quack() = {}
3 | def Walk() = {}
4 | def Fly() = {}
5 | }
6 |
7 | object OtherDuck {
8 | def Quack() = {}
9 | def Walk() = {}
10 | }
11 |
12 | object ThirdDuck {
13 | def Quack() = {}
14 | def Walk() = {}
15 | def Sit() = {}
16 | def Stand() = {}
17 | }
18 |
19 | object Bird {
20 | type Fn = () => Unit
21 |
22 | def M(quack: Fn, walk: Fn, fly: Option[Fn], sit: Option[Fn], stand: Option[Fn]) {
23 | quack()
24 | walk()
25 | fly.foreach(_())
26 | walk()
27 | quack()
28 | sit.foreach(_())
29 | quack()
30 | quack()
31 | stand.foreach(_())
32 | quack()
33 | }
34 |
35 | M(Duck.Quack, Duck.Walk, Some(Duck.Fly), None, None)
36 | M(OtherDuck.Quack, OtherDuck.Walk, None, None, None)
37 | M(ThirdDuck.Quack, ThirdDuck.Walk, None, Some(ThirdDuck.Sit), Some(ThirdDuck.Stand))
38 | }
39 |
40 |
--------------------------------------------------------------------------------
/src/test/scala/queens/QueensSpec.scala:
--------------------------------------------------------------------------------
1 | package queens
2 |
3 | import org.scalatest._
4 | import org.scalatest.Matchers._
5 |
6 | class QueensSpec extends FunSpec with Matchers {
7 | import Queens._
8 |
9 | describe("4 Queens") {
10 | it("all solution") {
11 | allSolution(4, 4) should contain theSameElementsAs
12 | Seq(Seq(2, 0, 3, 1), Seq(1, 3, 0, 2))
13 | }
14 |
15 | it("nothing to do") {
16 | lazy val solutions = allSolutionLog(4, 4)
17 | }
18 |
19 | it("all solution log") {
20 | lazy val solutions = allSolutionLog(4, 4)
21 | println("Searching first solution")
22 | solutions.take(1).toList
23 | println("Searching two solutions")
24 | solutions.take(2) should contain theSameElementsAs
25 | Seq(Seq(2, 0, 3, 1), Seq(1, 3, 0, 2))
26 | println("Searching three solutions")
27 | solutions.take(3).toList
28 | }
29 | }
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/src/main/scala/ddd/PaymentAPI.scala:
--------------------------------------------------------------------------------
1 | package ddd
2 |
3 | import Types._
4 |
5 | object PaymentAPI {
6 | sealed trait CardType
7 | case object MasterCard extends CardType
8 | case object Visa extends CardType
9 |
10 | type CardNumber = String
11 |
12 | sealed trait Currency {
13 | def rate: BigDecimal
14 | def sign: String
15 | }
16 | case class USD(rate: BigDecimal, sign: String = "$") extends Currency
17 | case class GBP(rate: BigDecimal, sign: String = "£") extends Currency
18 | case class EUR(rate: BigDecimal, sign: String = "€") extends Currency
19 | case class HUF(rate: BigDecimal, sign: String = "Ft") extends Currency
20 | case class Money(amount: BigDecimal, currency: Currency)
21 |
22 | sealed trait Payment
23 | case object Cash extends Payment
24 | case class Cheque(money: Money) extends Payment
25 | case class Card(cardType: CardType, cardNumber: CardNumber) extends Payment
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/handlebars/Handlebars.java:
--------------------------------------------------------------------------------
1 | package handlebars;
2 |
3 | import com.github.enpassant.ickenham.*;
4 | import com.github.enpassant.ickenham.adapter.JavaAdapter;
5 |
6 | import java.util.ArrayList;
7 | import java.util.HashMap;
8 | import java.util.List;
9 | import java.util.Map;
10 |
11 | import org.json.simple.parser.JSONParser;
12 |
13 | class Handlebars {
14 | public static void main(String[] args) {
15 | Ickenham ickenham = new Ickenham(new JavaAdapter());
16 |
17 | scala.Function1