sam
07/29/2019, 8:51 PMpakoito
07/29/2019, 8:56 PMpakoito
07/29/2019, 8:56 PMpakoito
07/29/2019, 8:56 PMpakoito
07/29/2019, 8:56 PMsam
07/29/2019, 8:57 PMpakoito
07/29/2019, 8:57 PMpakoito
07/29/2019, 8:57 PMsam
07/29/2019, 8:57 PMpakoito
07/29/2019, 8:58 PMsam
07/29/2019, 8:58 PMsam
07/29/2019, 8:58 PMpakoito
07/29/2019, 8:58 PMpakoito
07/29/2019, 8:58 PMsam
07/29/2019, 8:58 PMpakoito
07/29/2019, 8:58 PMsam
07/29/2019, 8:59 PMpakoito
07/29/2019, 8:59 PMpakoito
07/29/2019, 8:59 PMpakoito
07/29/2019, 8:59 PMsam
07/29/2019, 8:59 PMsam
07/29/2019, 9:00 PMpakoito
07/29/2019, 9:00 PMRobert Menke
07/29/2019, 9:00 PMsam
07/29/2019, 9:00 PMsam
07/29/2019, 9:01 PMRobert Menke
07/29/2019, 9:01 PMEither
all over the place and didn’t make proper use of IO
/**
* Execute some effect like logging
*/
inline fun <L, R> Either<L, R>.effectLeft(f: (L) -> Unit): Either<L, R> =
when(this) {
is Either.Right -> this
is Either.Left -> {
f(this.a)
this
}
}
/**
* Execute some effect like logging
*/
inline fun <L, R> Either<L, R>.effectRight(f: (R) -> Unit): Either<L, R> =
when(this) {
is Either.Right -> {
f(this.b)
this
}
is Either.Left -> this
}
sam
07/29/2019, 9:03 PMRobert Menke
07/29/2019, 9:04 PMsam
07/29/2019, 9:05 PMpakoito
07/29/2019, 9:05 PMpakoito
07/29/2019, 9:05 PMfx
here are the building blocks on top of itpakoito
07/29/2019, 9:05 PMsam
07/29/2019, 9:05 PMsam
07/29/2019, 9:06 PMpakoito
07/29/2019, 9:07 PMpakoito
07/29/2019, 9:08 PMsam
07/29/2019, 9:08 PMsam
07/29/2019, 9:08 PMRobert Menke
07/29/2019, 9:08 PMpakoito
07/29/2019, 9:09 PMpakoito
07/29/2019, 9:10 PMBut anyway, consider arrow-impure please beggingConsidered it is 😄 VVVV
I don’t think we’ve opposed it if someone owned it, even if it was in the repo. We don’t want to own it ourselves.
sam
07/29/2019, 9:17 PMDerek Berner
07/29/2019, 9:33 PMsam
07/29/2019, 9:34 PMDerek Berner
07/29/2019, 9:38 PMDerek Berner
07/29/2019, 9:39 PMsam
07/29/2019, 9:41 PMDerek Berner
07/29/2019, 9:42 PMsam
07/29/2019, 9:43 PMDerek Berner
07/29/2019, 9:43 PMarrow-data
in your build.gradle
sam
07/29/2019, 9:43 PMsam
07/29/2019, 9:43 PMDerek Berner
07/29/2019, 9:44 PMsuspend
functionsDerek Berner
07/29/2019, 9:44 PMsam
07/29/2019, 9:44 PMDerek Berner
07/29/2019, 9:44 PMsam
07/29/2019, 9:44 PMsam
07/29/2019, 9:45 PMDerek Berner
07/29/2019, 9:46 PMsam
07/29/2019, 9:47 PMsam
07/29/2019, 9:48 PMDerek Berner
07/29/2019, 9:48 PMRobert Menke
07/29/2019, 9:48 PMsam
07/29/2019, 9:48 PMsam
07/29/2019, 9:48 PMsam
07/29/2019, 9:49 PMDerek Berner
07/29/2019, 9:50 PMfun main() {
generateSequence(1) { it+1 }
.map { n ->
when {
n % 15 == 0 -> "FizzBuzz"
n % 5 == 0 -> "Buzz"
n % 3 == 0 -> "Fizz"
else -> n.toString()
}
}
.take(100)
.forEach { msg -> println(msg) }
}
Derek Berner
07/29/2019, 9:50 PMprintln
to the edge of the programsam
07/29/2019, 9:51 PMsam
07/29/2019, 9:51 PMDerek Berner
07/29/2019, 9:51 PMsam
07/29/2019, 9:52 PMDerek Berner
07/29/2019, 9:52 PMsam
07/29/2019, 9:52 PMsam
07/29/2019, 9:52 PMDerek Berner
07/29/2019, 9:53 PMsam
07/29/2019, 9:53 PMDerek Berner
07/29/2019, 9:53 PMsuspend
as a delineator of purity isn't massively complexDerek Berner
07/29/2019, 9:54 PMsuspend fun
at your disposalsam
07/29/2019, 9:54 PMsam
07/29/2019, 9:54 PMDerek Berner
07/29/2019, 9:54 PMsam
07/29/2019, 9:54 PMDerek Berner
07/29/2019, 9:55 PMMono
?sam
07/29/2019, 9:55 PMDerek Berner
07/29/2019, 9:55 PMsam
07/29/2019, 9:55 PMDerek Berner
07/29/2019, 9:56 PMsam
07/29/2019, 9:56 PMDerek Berner
07/29/2019, 9:56 PMDerek Berner
07/29/2019, 9:56 PMDerek Berner
07/29/2019, 9:57 PMDerek Berner
07/29/2019, 9:57 PMsam
07/29/2019, 9:57 PMDerek Berner
07/29/2019, 9:57 PMDerek Berner
07/29/2019, 9:58 PMCompletableFuture
in a 4-linerDerek Berner
07/29/2019, 9:58 PMkotlinx.coroutines.jdk8
librarysam
07/29/2019, 9:58 PMsam
07/29/2019, 9:58 PMDerek Berner
07/29/2019, 9:59 PMsam
07/29/2019, 9:59 PMDerek Berner
07/29/2019, 9:59 PMDerek Berner
07/29/2019, 10:00 PMsuspend
is not something to fearsam
07/29/2019, 10:00 PMDerek Berner
07/29/2019, 10:00 PMsam
07/29/2019, 10:01 PMDerek Berner
07/29/2019, 10:02 PMDerek Berner
07/29/2019, 10:02 PMDerek Berner
07/29/2019, 10:03 PMsuspend
sam
07/29/2019, 10:03 PMsam
07/29/2019, 10:03 PMDerek Berner
07/29/2019, 10:05 PMDerek Berner
07/29/2019, 10:05 PMDerek Berner
07/29/2019, 10:06 PMDerek Berner
07/29/2019, 10:06 PMsam
07/29/2019, 10:07 PMDerek Berner
07/29/2019, 10:10 PMtry { s.toInt().right() } catch(e: NumberFormatException) { NotANumber(s,e.message).left() }
Derek Berner
07/29/2019, 10:11 PMsam
07/29/2019, 10:11 PMDerek Berner
07/29/2019, 10:11 PMsam
07/29/2019, 10:11 PMsam
07/29/2019, 10:11 PMsam
07/29/2019, 10:11 PMsam
07/29/2019, 10:12 PMsam
07/29/2019, 10:14 PMDerek Berner
07/29/2019, 10:16 PMDerek Berner
07/29/2019, 10:16 PMsam
07/29/2019, 10:17 PMDerek Berner
07/29/2019, 10:17 PMsam
07/29/2019, 10:17 PMDerek Berner
07/29/2019, 10:18 PMDerek Berner
07/29/2019, 10:18 PMsam
07/29/2019, 10:18 PMDerek Berner
07/29/2019, 10:18 PMsam
07/29/2019, 10:18 PMsam
07/29/2019, 10:18 PMsam
07/29/2019, 10:18 PMsam
07/29/2019, 10:20 PMsam
07/29/2019, 10:20 PMDerek Berner
07/29/2019, 10:20 PMDerek Berner
07/29/2019, 10:20 PMDerek Berner
07/29/2019, 10:21 PMDerek Berner
07/29/2019, 10:21 PMsuspend
to one of those and let Spring do itDerek Berner
07/29/2019, 10:21 PMsuspend
itself is a pretty simple concept - don't call suspend
from non-suspend
sam
07/29/2019, 10:21 PMDerek Berner
07/29/2019, 10:22 PMimpure
from `pure`"Derek Berner
07/29/2019, 10:22 PMDerek Berner
07/29/2019, 10:22 PMsam
07/29/2019, 10:22 PMfun connect(): Either<DatabaseError, Connection>()
or fun connect(): Connection // throws exception
sam
07/29/2019, 10:23 PMfun connect(): IO<Connection>
<-- that will come later as skills increase.Derek Berner
07/29/2019, 10:24 PMsuspend fun connect()
gives you an extra layer of protection. Some idiot can't go into (non-suspending) fun Employee.isPartTime()
and call connect()
sam
07/29/2019, 10:24 PMDerek Berner
07/29/2019, 10:24 PMIO
heresam
07/29/2019, 10:24 PMsam
07/29/2019, 10:24 PMsam
07/29/2019, 10:25 PMDerek Berner
07/29/2019, 10:25 PMsam
07/29/2019, 10:25 PMsam
07/29/2019, 10:25 PMDerek Berner
07/29/2019, 10:25 PMsam
07/29/2019, 10:26 PMDerek Berner
07/29/2019, 10:26 PMsam
07/29/2019, 10:26 PMDerek Berner
07/29/2019, 10:27 PMsam
07/29/2019, 10:28 PMsam
07/29/2019, 10:29 PMDerek Berner
07/29/2019, 10:29 PMsam
07/29/2019, 10:29 PMDerek Berner
07/29/2019, 10:34 PMobject Unsafe {
inline fun <E, reified X: Throwable, T> attempt(handle: (X) -> E, action: () -> T) =
try {
action().left()
} catch(e: Throwable) {
if (e is X) {
handle(e.right())
} else {
throw e
}
}
}
fun <E,T> unsafe(action: Unsafe.() -> Either<E,T>): Either<E,T> =
Unsafe.action()
fun main() {
val str = "a"
val result = unsafe {
attempt({e: NumberFormatException -> "Not a number: $str"}) {
str.toInt()
}
}
println(result)
}
Derek Berner
07/29/2019, 10:34 PMDerek Berner
07/29/2019, 10:35 PMDerek Berner
07/29/2019, 10:36 PMsam
07/29/2019, 10:37 PMsam
07/29/2019, 10:38 PMsam
07/29/2019, 10:39 PMDerek Berner
07/29/2019, 10:39 PMsam
07/29/2019, 10:39 PMDerek Berner
07/29/2019, 10:40 PMsam
07/29/2019, 10:40 PMDerek Berner
07/29/2019, 10:40 PMsam
07/29/2019, 10:40 PMDerek Berner
07/29/2019, 10:41 PM@AllowUnsafe
up your call stack is pretty similar to propagating suspend
sam
07/29/2019, 10:41 PMsam
07/29/2019, 10:41 PMDerek Berner
07/29/2019, 10:42 PMsam
07/29/2019, 10:42 PMsam
07/29/2019, 10:42 PMsam
07/29/2019, 10:42 PMsam
07/29/2019, 10:42 PMDerek Berner
07/29/2019, 10:42 PMDerek Berner
07/29/2019, 10:43 PMDerek Berner
07/29/2019, 10:43 PMsam
07/29/2019, 10:44 PMDerek Berner
07/29/2019, 10:45 PM"abc".toInt()
and db.connect()
sam
07/29/2019, 10:46 PMDerek Berner
07/29/2019, 10:46 PMsam
07/29/2019, 10:46 PMpakoito
07/29/2019, 10:57 PMpakoito
07/29/2019, 10:57 PMsam
07/29/2019, 10:57 PMpakoito
07/29/2019, 10:58 PMpakoito
07/29/2019, 10:58 PMpakoito
07/29/2019, 10:58 PMsam
07/29/2019, 10:58 PMpakoito
07/29/2019, 11:01 PMpakoito
07/29/2019, 11:01 PMpakoito
07/29/2019, 11:02 PMsam
07/29/2019, 11:02 PMpakoito
07/29/2019, 11:02 PMsam
07/29/2019, 11:03 PMfun connect(): Either<DatabaseError, Connection>()
sam
07/29/2019, 11:03 PMsam
07/29/2019, 11:03 PMpakoito
07/29/2019, 11:05 PMsam
07/29/2019, 11:05 PMsam
07/29/2019, 11:06 PMsam
07/29/2019, 11:07 PM