sam
06/03/2019, 3:16 PMBob Glamm
06/03/2019, 3:17 PMsam
06/03/2019, 3:17 PMsam
06/03/2019, 3:18 PMraulraja
06/03/2019, 3:19 PMraulraja
06/03/2019, 3:20 PMsuspend validateAndEffect(): ValidatedNel<Error, A>
or
fun validateAndEffect(): IO<ValidatedNel<Error, A>>
sam
06/03/2019, 3:20 PMsam
06/03/2019, 3:20 PMraulraja
06/03/2019, 3:20 PMmap
from applicative which supports up to 10 opsraulraja
06/03/2019, 3:21 PMtupled
sam
06/03/2019, 3:21 PMsam
06/03/2019, 3:21 PMsam
06/03/2019, 3:21 PMraulraja
06/03/2019, 3:21 PMsam
06/03/2019, 3:21 PMBob Glamm
06/03/2019, 3:21 PMIO
sam
06/03/2019, 3:21 PMsam
06/03/2019, 3:22 PMBob Glamm
06/03/2019, 3:23 PMBob Glamm
06/03/2019, 3:23 PMsam
06/03/2019, 3:23 PMsam
06/03/2019, 3:23 PMsam
06/03/2019, 3:23 PMBob Glamm
06/03/2019, 3:23 PMsam
06/03/2019, 3:23 PMsam
06/03/2019, 3:24 PMsam
06/03/2019, 3:24 PMBob Glamm
06/03/2019, 3:26 PMsam
06/03/2019, 3:26 PMsam
06/03/2019, 3:27 PMsam
06/03/2019, 3:27 PMBob Glamm
06/03/2019, 3:27 PMsam
06/03/2019, 3:27 PMsam
06/03/2019, 3:27 PMsam
06/03/2019, 3:28 PMraulraja
06/03/2019, 3:28 PMfun <A> validate(f () -> A): ValidatedNel<Throwable, A> =
try { f().validNel() }
catch (e: Exception) {
e.nonFatalOrThrow().invalidNel()
}
raulraja
06/03/2019, 3:28 PMTry
raulraja
06/03/2019, 3:28 PMsam
06/03/2019, 3:29 PMsam
06/03/2019, 3:29 PMraulraja
06/03/2019, 3:29 PMEither
not validatedBob Glamm
06/03/2019, 3:29 PMraulraja
06/03/2019, 3:29 PMraulraja
06/03/2019, 3:30 PMandThen
for validated which shortcircuitssam
06/03/2019, 3:30 PMfun foo() {
binding {
val a = something()
val b = validate(a)
val c = copy(b)
val d = bar(a, b)
result(d)
}
}
raulraja
06/03/2019, 3:30 PMsam
06/03/2019, 3:30 PMsam
06/03/2019, 3:30 PMraulraja
06/03/2019, 3:30 PMsam
06/03/2019, 3:31 PMraulraja
06/03/2019, 3:31 PMbinding
at allraulraja
06/03/2019, 3:31 PMsam
06/03/2019, 3:32 PMraulraja
06/03/2019, 3:32 PMraulraja
06/03/2019, 3:32 PMsam
06/03/2019, 3:32 PMfun foo() {
val a = something()
val b = a.map { validate(a) }
val c = b.map { copy(b) }
val d = c.map { bar(a, b) }
d.map { result(d) }
}
Bob Glamm
06/03/2019, 3:32 PMsam
06/03/2019, 3:32 PMBob Glamm
06/03/2019, 3:33 PMsam
06/03/2019, 3:33 PMsam
06/03/2019, 3:33 PMsam
06/03/2019, 3:33 PMBob Glamm
06/03/2019, 3:38 PMc.map { bar(a, b) }
supposed to do?sam
06/03/2019, 3:38 PMsam
06/03/2019, 3:38 PMsam
06/03/2019, 3:39 PMraulraja
06/03/2019, 3:39 PMsam
06/03/2019, 3:40 PMsam
06/03/2019, 3:40 PMDerek Berner
06/03/2019, 3:40 PMEither<E,T>
sam
06/03/2019, 3:41 PMsam
06/03/2019, 3:41 PMsam
06/03/2019, 3:41 PMDerek Berner
06/03/2019, 3:41 PMEither<Exception, T>
isn't getting deprecated thoughsam
06/03/2019, 3:41 PMsam
06/03/2019, 3:41 PMsam
06/03/2019, 3:42 PMDerek Berner
06/03/2019, 3:42 PMEither
is statelesssam
06/03/2019, 3:42 PMsam
06/03/2019, 3:42 PMDerek Berner
06/03/2019, 3:43 PMDerek Berner
06/03/2019, 3:43 PMNel
)sam
06/03/2019, 3:43 PMsam
06/03/2019, 3:43 PMsam
06/03/2019, 3:43 PMDerek Berner
06/03/2019, 3:43 PMMonoid
so you can fill in the behavior)sam
06/03/2019, 3:43 PMsam
06/03/2019, 3:44 PMsam
06/03/2019, 3:44 PMDerek Berner
06/03/2019, 3:44 PMmonoid
code out of a python projectsam
06/03/2019, 3:44 PMsam
06/03/2019, 3:44 PMsam
06/03/2019, 3:44 PMsam
06/03/2019, 3:44 PMraulraja
06/03/2019, 3:45 PMDerek Berner
06/03/2019, 3:45 PMraulraja
06/03/2019, 3:45 PMimport arrow.core.Either
import arrow.core.extensions.either.fx.fx
import arrow.core.right
fun something(): Either<Throwable, String> = "something".right()
fun validate(a: String): Either<Throwable, String> = "validate($a)".right()
fun copy(b: String): Either<Throwable, String> = "copy($b)".right()
fun bar (a: String, b: String, c: String): Either<Throwable, String> = "bar($a, $b, $c)".right()
fun result(d: String): Either<Throwable, String> = "result($d)".right()
val result = fx<Throwable, String> {
val a = !something()
val b = !validate(a)
val c = !copy(b)
val d = !bar(a, b, c)
!result(d)
}
fun main() {
println(result) //Right(b=result(bar(something, validate(something), copy(validate(something)))))
}
sam
06/03/2019, 3:45 PMDerek Berner
06/03/2019, 3:45 PMDerek Berner
06/03/2019, 3:46 PMNel
has no identity so it's a Semigroup
that Validated
wantsDerek Berner
06/03/2019, 3:46 PMsam
06/03/2019, 3:46 PMsam
06/03/2019, 3:46 PMsam
06/03/2019, 3:47 PMsam
06/03/2019, 3:47 PMsam
06/03/2019, 3:47 PMDerek Berner
06/03/2019, 3:47 PMEitherT
or you can use flatMap
sam
06/03/2019, 3:47 PMDerek Berner
06/03/2019, 3:48 PMsam
06/03/2019, 3:48 PMsam
06/03/2019, 3:48 PMsam
06/03/2019, 3:48 PMDerek Berner
06/03/2019, 3:48 PMsam
06/03/2019, 3:49 PMDerek Berner
06/03/2019, 3:49 PMsam
06/03/2019, 3:49 PMDerek Berner
06/03/2019, 3:49 PMDerek Berner
06/03/2019, 3:50 PMOption
from the type signatureDerek Berner
06/03/2019, 3:50 PMsam
06/03/2019, 3:50 PMsam
06/03/2019, 3:50 PMDerek Berner
06/03/2019, 3:51 PMDerek Berner
06/03/2019, 3:51 PMsam
06/03/2019, 3:51 PMsam
06/03/2019, 3:51 PMsam
06/03/2019, 3:51 PMDerek Berner
06/03/2019, 3:52 PMsam
06/03/2019, 3:52 PMraulraja
06/03/2019, 3:52 PMDerek Berner
06/03/2019, 3:52 PMraulraja
06/03/2019, 3:52 PMsam
06/03/2019, 3:52 PMsam
06/03/2019, 3:52 PMsam
06/03/2019, 3:52 PMraulraja
06/03/2019, 3:52 PMstartCoroutine
and that requires a run loop with latches and shitsam
06/03/2019, 3:53 PMsam
06/03/2019, 3:53 PMraulraja
06/03/2019, 3:53 PMDerek Berner
06/03/2019, 3:53 PMsam
06/03/2019, 3:53 PMraulraja
06/03/2019, 3:54 PMsam
06/03/2019, 3:54 PMsam
06/03/2019, 3:54 PMDerek Berner
06/03/2019, 3:54 PMsam
06/03/2019, 3:54 PMDerek Berner
06/03/2019, 3:54 PMfx
may be possibleDerek Berner
06/03/2019, 3:54 PMDerek Berner
06/03/2019, 3:55 PMsam
06/03/2019, 3:55 PMsam
06/03/2019, 3:55 PMsam
06/03/2019, 3:55 PMsam
06/03/2019, 3:56 PMBob Glamm
06/03/2019, 4:00 PMBob Glamm
06/03/2019, 4:01 PMas.map(a -> a.foo = "bar")
😕Bob Glamm
06/03/2019, 4:01 PMDerek Berner
06/03/2019, 4:02 PMDerek Berner
06/03/2019, 4:03 PMraulraja
06/03/2019, 4:04 PMRules
class similar to the error handling example and then just expose a DSL where users are not even aware of the typesDerek Berner
06/03/2019, 4:04 PMraulraja
06/03/2019, 4:05 PMIO
in the next version comes with io.suspended
and <http://suspended.io|suspended.io>
raulraja
06/03/2019, 4:05 PMraulraja
06/03/2019, 4:06 PMIO<A>
and suspend () -> A
represent the same thing and IO
includes additional APi’s for resource handling etc which allow nesting and use of things like flatMap, bracketCase etc.Bob Glamm
06/03/2019, 4:07 PMIO
is a steep hill to climb, especially in the middle of a high-volume production scheduleraulraja
06/03/2019, 4:07 PMsuspend
in the next release and erase the IO wrapper from the function return if you don’t want the IO type to be in all the function signaturesraulraja
06/03/2019, 4:07 PMDerek Berner
06/03/2019, 4:07 PMDerek Berner
06/03/2019, 4:08 PMBob Glamm
06/03/2019, 4:08 PMIO
hill and leave the signatures in since it's consistent with cats IO and Haskellraulraja
06/03/2019, 4:08 PMNonBlocking.parMap
for exampleBob Glamm
06/03/2019, 4:08 PMraulraja
06/03/2019, 4:08 PMDerek Berner
06/03/2019, 4:08 PMKind<Applicative<*>,suspend () -> A> -> suspend () -> Kind<Applicative<*>,F<A>>
Derek Berner
06/03/2019, 4:09 PMraulraja
06/03/2019, 4:09 PMraulraja
06/03/2019, 4:09 PMthreadName
is an effect thereraulraja
06/03/2019, 4:09 PMraulraja
06/03/2019, 4:10 PMDerek Berner
06/03/2019, 4:10 PMsuspend
if IO
is too steep a hill to climbraulraja
06/03/2019, 4:10 PMraulraja
06/03/2019, 4:10 PMraulraja
06/03/2019, 4:11 PMraulraja
06/03/2019, 4:11 PMraulraja
06/03/2019, 4:12 PMDerek Berner
06/03/2019, 4:12 PMraulraja
06/03/2019, 4:13 PMraulraja
06/03/2019, 4:13 PMraulraja
06/03/2019, 4:14 PMsam
06/03/2019, 7:11 PMbinding {}
I need to use IO
?sam
06/03/2019, 7:13 PMraulraja
06/03/2019, 8:02 PMraulraja
06/03/2019, 8:02 PMsam
06/03/2019, 8:07 PMbinding {}
or I can wait until 0.10 and then coroutines will magically work from within binding as well ?Derek Berner
06/03/2019, 8:16 PMDerek Berner
06/03/2019, 8:17 PMIO
or suspend fun main
or runBlocking
sam
06/03/2019, 8:17 PMsam
06/03/2019, 8:18 PMraulraja
06/03/2019, 8:34 PMsam
06/03/2019, 8:34 PMraulraja
06/03/2019, 8:34 PMsam
06/03/2019, 8:35 PMbinding {
val (a) = fromEither...
val (b) = from(a)
val c = someSuspendFunction(b)
result(c)
}
sam
06/03/2019, 8:36 PMbinding {
val (a) = fromEither...
val (b) = from(a)
val c = runBlocking { someSuspendFunction(b) }
result(c)
}
A temp workaround for a few daysraulraja
06/03/2019, 8:36 PMsam
06/03/2019, 8:36 PMraulraja
06/03/2019, 8:37 PMimport arrow.effects.extensions.io.fx.fx
fx {
val a = !effectOrRaise { fromEither }
val b = !efffectOrRaise { from(a) }
val c = !effect { someSuspendFunction(b) }
result(c)
}
sam
06/03/2019, 8:38 PMraulraja
06/03/2019, 8:38 PMsam
06/03/2019, 8:38 PMsam
06/03/2019, 8:38 PMsam
06/03/2019, 8:39 PMraulraja
06/03/2019, 8:39 PMsuspend () -> Either<A, B>
raulraja
06/03/2019, 8:39 PMsam
06/03/2019, 8:39 PMraulraja
06/03/2019, 8:39 PMsam
06/03/2019, 8:40 PMraulraja
06/03/2019, 8:40 PMraulraja
06/03/2019, 8:40 PMraulraja
06/03/2019, 8:41 PMraulraja
06/03/2019, 8:41 PMsam
06/03/2019, 8:41 PMraulraja
06/03/2019, 8:41 PMrunblocking
raulraja
06/03/2019, 8:41 PME
and A
raulraja
06/03/2019, 8:41 PMraulraja
06/03/2019, 8:42 PMsam
06/03/2019, 8:42 PMraulraja
06/03/2019, 8:43 PMsam
06/03/2019, 8:43 PMsam
06/03/2019, 8:43 PMraulraja
06/03/2019, 8:43 PMraulraja
06/03/2019, 8:44 PMraulraja
06/03/2019, 8:44 PMsam
06/03/2019, 8:44 PMfx {
val (a) = someIO...
val (b) = from(a)
val c = someSuspendFunction(b)
result(c)
}
raulraja
06/03/2019, 8:45 PM(a)
syntaxsam
06/03/2019, 8:45 PMraulraja
06/03/2019, 8:45 PMraulraja
06/03/2019, 8:45 PMraulraja
06/03/2019, 8:45 PMsam
06/03/2019, 8:45 PMraulraja
06/03/2019, 8:45 PMraulraja
06/03/2019, 8:45 PM!fa
or fa.bind()
raulraja
06/03/2019, 8:46 PMsam
06/03/2019, 8:46 PMsam
06/03/2019, 8:46 PMraulraja
06/03/2019, 8:46 PMsam
06/03/2019, 8:46 PMsimon.vergauwen
06/03/2019, 8:46 PMval ((a, b)) = tupled()
raulraja
06/03/2019, 8:46 PMsam
06/03/2019, 8:46 PMsam
06/03/2019, 8:46 PMDerek Berner
06/03/2019, 8:47 PMsimon.vergauwen
06/03/2019, 8:47 PM+
as an operator in buildersraulraja
06/03/2019, 8:47 PM!!
Derek Berner
06/03/2019, 8:47 PMsimon.vergauwen
06/03/2019, 8:47 PM+
is used in mutable builders so 🤷♂️sam
06/03/2019, 8:48 PMraulraja
06/03/2019, 8:48 PMsam
06/03/2019, 8:48 PMDerek Berner
06/03/2019, 8:48 PMDerek Berner
06/03/2019, 8:49 PMraulraja
06/03/2019, 8:49 PMbind()
is a pain on each bind when you just want to extract the valuesam
06/03/2019, 8:49 PMDerek Berner
06/03/2019, 8:49 PMsam
06/03/2019, 8:50 PMraulraja
06/03/2019, 8:50 PMsam
06/03/2019, 8:50 PMsam
06/03/2019, 8:50 PMraulraja
06/03/2019, 8:50 PMraulraja
06/03/2019, 8:50 PMsam
06/03/2019, 8:51 PMraulraja
06/03/2019, 8:51 PMfa()
vs !fa
or fa.bind()
sam
06/03/2019, 8:51 PMsam
06/03/2019, 8:51 PMval a = fa()()
simon.vergauwen
06/03/2019, 8:52 PM!
raulraja
06/03/2019, 8:53 PMsam
06/03/2019, 8:58 PMDerek Berner
06/03/2019, 9:20 PMDerek Berner
06/03/2019, 9:21 PMsam
06/03/2019, 9:21 PMsam
06/03/2019, 9:22 PMsam
06/03/2019, 9:22 PMsam
06/03/2019, 9:22 PMDerek Berner
06/03/2019, 9:23 PMsam
06/03/2019, 9:23 PMsam
06/03/2019, 9:23 PMsam
06/03/2019, 9:23 PM