Future基于Kotlin协同程序的简单的monadic未来实现

网友投稿 581 2022-10-24

Future基于Kotlin协同程序的简单的monadic未来实现

Future基于Kotlin协同程序的简单的monadic未来实现

A simple monadic future implementation based on coroutines for Kotlin

Usage

It's a simple type that help us to manage the asynchrony and the concurrency. With this library you can write async code in sync way.

For launch an async process it's as simple as this:

Future { doHeavyTask() }

If it's necessary to obtain a result and process it this is the way:

val myResultFuture = Future { getResultFromMyServer() }myResultFuture.map { processMyResult(it) }

If there is concurrency and we need to process more than one result together we should use flatMap and map:

val myResultFuture = Future { getResultFromMyServer() }val myOtherResultFuture = Future { getOtherResultFromMyServer() } val myDataProcessedFuture = myResultFuture.flatMap { myResult -> myOtherResult.map { myOtherResult -> processTogether(myResult, myOtherResult) }}

And if you need apply effects in the UI the method for this is onComplete:

myDataProcessedFuture.onComplete { renderResult(it) }

If use map and flatMap together is weird or ugly for you, you can implement methods like this for avoid boilerplate. Maybe in next versions this library could include a solution for this.

fun forComprehension(f1: Future, f2: Future, function: (T, K) -> R): Future { return f1.flatMap { it1 -> f2.map { it2 -> function(it1, it2) } }} // And this codeval myDataProcessedFuture = myResultFuture.flatMap { myResult -> myOtherResult.map { myOtherResult -> processTogether(myResult, myOtherResult) }} // Would be like thisval result = forComprehension(myResultFuture, myOtherResult) { myResult, myOtherResult -> processTogether(myResult, myOtherResult)}

Here a complete example:

fun initLoadData() { val myResultFuture = Future { getResultFromMyServer() } val myOtherResultFuture = Future { getOtherResultFromMyServer() } val result = forComprehension(myResultFuture, myOtherResult) { myResult, myOtherResult -> processTogether(myResult, myOtherResult) } result.onComplete { renderResult(it) }}

Distribution

Add as a dependency to your build.gradle

repositories { ... maven { url 'https://jitpack.io' } maven { url "https://kotlin.bintray.com/kotlinx/" }} dependencies { compile 'com.github.JMPergar:FutureK:v0.12'}

License

Copyright 2017 José Manuel Pereira GarcíaLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:有些人天生不适合程序员,看看你中没有?
下一篇:计科一二班数据结构《实验十报告》参考答案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~