-
Notifications
You must be signed in to change notification settings - Fork 0
/
the-wonderful-option-space.scala
39 lines (33 loc) · 1.09 KB
/
the-wonderful-option-space.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def toDoubleOption(value: String): Option[Double] = {
try {
Some(value.toDouble)
} catch {
case e: Exception => None
}
}
def divide(a: Double, b: Double): Option[Double] = {
(a,b) match {
case (_,0) => None
case _ => Some(a/b)
}
}
def plus(a: Double, b: Double): Option[Double] = {
Some(a+b)
}
def Add100EachAndThenFoldDivide(str:String) = {
val splitedValues = str.split(",")
val add100function = plus(_:Double, 100)
val convertedValues = splitedValues.map(toDoubleOption)
val valuesIncreasedBy100 = convertedValues.map(_.flatMap(add100function))
val foldDivideValue = valuesIncreasedBy100.reduce((acc, value) => {
(acc, value) match {
case (Some(a: Double), Some(b: Double)) => divide(a, b)
case _ => None
}
})
foldDivideValue
}
Add100EachAndThenFoldDivide("99900,100") //res0: Option[Double] = Some(500.0)
Add100EachAndThenFoldDivide("99900,100,0") //res1: Option[Double] = Some(5.0)
Add100EachAndThenFoldDivide("100,50,1000,BLA,60,64.5") //res2: Option[Double] = None
Add100EachAndThenFoldDivide("100,50,-100") //res3: Option[Double] = None