daneko
01/04/2019, 6:44 AMList<Either<A,B>>
to Either<A,List<B>>
.
until 0.8.1, I used ListK.sequence
.
val src = List<Either<A,B>>
// 0.8.1
// import arrow.data.sequence
val result: Either<A, List<B>> = src.k().sequence(Either.applicative()).fix()
// 0.8.2
// which is the preferred ? or another solution?
// use ListK#traverse
val result: Either<A, List<B>> = src.k().traverse(Either.applicative(), ::identity).fix()
// import arrow.instances.listk.traverse.sequence
// import arrow.instances.either.functor.map
val result: Either<A, List<B>> = src.k().sequence(Either.applicative()).map{ it.fix() }
jacob
01/04/2019, 6:54 AMjacob
01/04/2019, 6:54 AMdaneko
01/04/2019, 7:05 AMarrow.instances.either.functor.map
, so don’t need to map{it.fix()}.fix()
thx your pointing out. I edited my post.raulraja
01/04/2019, 10:34 AMpakoito
01/04/2019, 11:47 AMimport arrow.instances.listk.traverse.sequence
and it wouldn't return a Kind
pakoito
01/04/2019, 11:48 AMraulraja
01/04/2019, 5:48 PMraulraja
01/05/2019, 12:37 PMraulraja
01/05/2019, 12:38 PMbjonnh
01/06/2019, 4:41 AMbjonnh
01/06/2019, 4:47 AMbjonnh
01/06/2019, 5:37 AMbjonnh
01/06/2019, 6:04 AMbjonnh
01/06/2019, 6:20 AMbjonnh
01/06/2019, 6:22 AMbjonnh
01/06/2019, 6:31 AMbjonnh
01/06/2019, 8:21 AMfun worksFromDoi(doi: String): IO<WorksResponse> =
binding {
IO { calcDelay() }.bind()
DeferredK<HttpClientCall> {
httpClient.call("$API_URL/works/$doi") {
method = HttpMethod.Get
}
}.map { call ->
IO.async().delay {
updateDelayFromHeaderData(
call.response.headers.get("X-Rate-Limit-Limit"),
call.response.headers.get("X-Rate-Limit-Interval")
)
}
IO.async().delay { updateLastQueryTime() }
when (call.response.status.value) {
200 -> IO<WorksResponse> {
DeferredK<WorksResponse> {
worksAdapter.fromJson(
call.response.readText()
) ?: WorksResponse(status = "failed-locally")
}.handleError { WorksResponse(status = "failed-locally") }.getCompleted()
}
404 -> IO.raiseError<WorksResponse>(NonExistentReference)
else -> IO.raiseError<WorksResponse>(UnManagedReturnCode(call.response.status.value))
}
}.handleError { IO.raiseError<WorksResponse>(DecodingError) }.value().getCompleted()
}.fix().unsafeRunSync()
That's where I am stuck for now when I run that, I get a Exception in thread "main" java.lang.IllegalStateException: This job has not completed yetbjonnh
01/06/2019, 8:58 AMraulraja
01/06/2019, 12:42 PMraulraja
01/06/2019, 12:43 PMraulraja
01/06/2019, 12:43 PMraulraja
01/06/2019, 5:07 PMbjonnh
01/06/2019, 5:28 PMkitttn
01/07/2019, 3:02 PMpardom
01/07/2019, 3:21 PMpardom
01/07/2019, 3:23 PMraulraja
01/07/2019, 5:53 PMraulraja
01/07/2019, 5:53 PMbjonnh
01/07/2019, 9:24 PMimport <http://arrow.effects.IO|arrow.effects.IO>
import arrow.effects.extensions.io.monad.binding
data class Obj(val a: String)
sealed class KnownError : RuntimeException()
object DecodingError : KnownError()
fun apiCall(s: String) = IO {
"Some string"
}
fun convert(s: String): Obj? {
return Obj("Some other output")
}
fun work(s: String): IO<Obj> =
IO.run {
binding {
val output = apiCall(s)
val obj = convert(output.bind())
if (obj != null)
obj
else
raiseError<Obj>(DecodingError)
}
}