Problem
val result: Either[String, Int] =
for {
dividend <- Right(42)
divisor <- Right(2)
divisorVerified <- if (divisor != 0) Right(divisor) else Left("Divisor must not be zero!")
} yield dividend / divisor
println(result match {
case Right(value) => value
case Left(error) => error
})
Lösung
const result: Result<number, string> =
For._("dividend", success(42))
._("divisor", success(2))
._("divisorVerified", ({divisor}) => divisor != 0 ? success(divisor) : failure("Divisor must not be zero!"))
.yield(({dividend, divisorVerified}) => dividend / divisorVerified)
console.log(isSuccess(result) ? result.value : result.error)
Die Bibliothek beinhaltet auch eine asynchrone Variante, die eine nahtlose Integration von normalen und asynchronen Funktionen mit denselben Monaden erlaubt. Das funktioniert ganz ohne explizites Handling von Promises.
for-comprehension-ts kann mit allen Implementierungen eines Monad Interfaces verwendet werden, welches die Operationen map, flatMap und flatMapAsync umfasst. Die Bibliothek beinhaltet bereits Implementierungen für die folgenden Monaden:
Im Gegensatz zu Pipes erlaubt die Syntax, dass Programme gerichtete azyklische Graphen (DAG) sein können, deren Knoten benannte Werte (z. B. a=3) und deren Kanten Funktionen sind. Der Graph wird lazy ausgewertet, d. h., die tatsächliche Ausführung erfolgt erst, wenn yield aufgerufen wird. Aus diesem Grund können for-comprehension-ts-Programme dupliziert, verzweigt und wiederholt werden. Dabei werden Operationen nur so lange ausgeführt, bis der erste Fehler oder fehlende Wert auftritt. Das genaue Verhalten häng dabei stets von der verwendeten Monade ab.
Beitragen
for-comprehension-ts wird von jambit entwickelt und ist bisher noch nicht in produktivem Einsatz. Ihr könnt also gern zum Projekt beitragen oder einfach die Bibliothek benutzen:
- Quellcode: https://github.com/p3et/for-comprehension-ts
- Scalas for comprehension: https://www.baeldung.com/scala/for-comprehension
---
Autor: André Petermann / Senior Software Architect / Standort Leipzig
Toilet Paper #159 als Download: Something like Scala's for comprehension in Typescript (PDF)
Lust, das nächste ToiletPaper zu schreiben? Jetzt bei jambit bewerben!