c3534276b4
Kotlin has it's own error method, therefore the IDE doesn't immediately prompt the user to import our error factory method.
108 lines
3.2 KiB
Kotlin
108 lines
3.2 KiB
Kotlin
package com.mikebull94.result
|
|
|
|
inline fun <T, R, E> Iterable<T>.fold(
|
|
initial: R,
|
|
operation: (acc: R, T) -> Result<R, E>
|
|
): Result<R, E> {
|
|
var accumulator = initial
|
|
|
|
forEach { element ->
|
|
val operationResult = operation(accumulator, element)
|
|
|
|
when (operationResult) {
|
|
is Ok -> {
|
|
accumulator = operationResult.value
|
|
}
|
|
is Error -> return err(operationResult.error)
|
|
}
|
|
}
|
|
|
|
return ok(accumulator)
|
|
}
|
|
|
|
inline fun <T, R, E> List<T>.foldRight(
|
|
initial: R,
|
|
operation: (T, acc: R) -> Result<R, E>
|
|
): Result<R, E> {
|
|
var accumulator = initial
|
|
|
|
if (!isEmpty()) {
|
|
val iterator = listIterator(size)
|
|
while (iterator.hasPrevious()) {
|
|
val operationResult = operation(iterator.previous(), accumulator)
|
|
|
|
when (operationResult) {
|
|
is Ok -> {
|
|
accumulator = operationResult.value
|
|
}
|
|
is Error -> return err(operationResult.error)
|
|
}
|
|
}
|
|
}
|
|
|
|
return ok(accumulator)
|
|
}
|
|
|
|
/**
|
|
* - Elm: [Result.Extra.combine](http://package.elm-lang.org/packages/circuithub/elm-result-extra/1.4.0/Result-Extra#combine)
|
|
*/
|
|
fun <V, E> combine(vararg results: Result<V, E>) = results.asIterable().combine()
|
|
|
|
/**
|
|
* - Elm: [Result.Extra.combine](http://package.elm-lang.org/packages/circuithub/elm-result-extra/1.4.0/Result-Extra#combine)
|
|
*/
|
|
fun <V, E> Iterable<Result<V, E>>.combine(): Result<List<V>, E> {
|
|
return ok(map {
|
|
when (it) {
|
|
is Ok -> it.value
|
|
is Error -> return err(it.error)
|
|
}
|
|
})
|
|
}
|
|
|
|
/**
|
|
* - Haskell: [Data.Either.lefts](https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Either.html#v:lefts)
|
|
*/
|
|
fun <V, E> getAll(vararg results: Result<V, E>) = results.asIterable().getAll()
|
|
|
|
/**
|
|
* - Haskell: [Data.Either.lefts](https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Either.html#v:lefts)
|
|
*/
|
|
fun <V, E> Iterable<Result<V, E>>.getAll(): List<V> {
|
|
return filter { it is Ok }.map { (it as Ok).value }
|
|
}
|
|
|
|
/**
|
|
* - Haskell: [Data.Either.rights](https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Either.html#v:rights)
|
|
*/
|
|
fun <V, E> getAllErrors(vararg results: Result<V, E>) = results.asIterable().getAllErrors()
|
|
|
|
/**
|
|
* - Haskell: [Data.Either.rights](https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Either.html#v:rights)
|
|
*/
|
|
fun <V, E> Iterable<Result<V, E>>.getAllErrors(): List<E> {
|
|
return filter { it is Error }.map { (it as Error).error }
|
|
}
|
|
|
|
/**
|
|
* - Haskell: [Data.Either.partitionEithers](https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Either.html#v:partitionEithers)
|
|
*/
|
|
fun <V, E> partition(vararg results: Result<V, E>) = results.asIterable().partition()
|
|
|
|
/**
|
|
* - Haskell: [Data.Either.partitionEithers](https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Either.html#v:partitionEithers)
|
|
*/
|
|
fun <V, E> Iterable<Result<V, E>>.partition(): Pair<List<V>, List<E>> {
|
|
val values = mutableListOf<V>()
|
|
val errors = mutableListOf<E>()
|
|
|
|
forEach { result ->
|
|
when (result) {
|
|
is Ok -> values.add(result.value)
|
|
is Error -> errors.add(result.error)
|
|
}
|
|
}
|
|
|
|
return Pair(values, errors)
|
|
}
|