From 07c45d84d0badb41036ca4a678f23b8035b1c229 Mon Sep 17 00:00:00 2001 From: kageru Date: Wed, 13 Nov 2019 22:06:30 +0100 Subject: [PATCH] Generify mapFirst/Second on Tuples --- .../kageru/kagebot/extensions/ArrowExtensions.kt | 13 ++++++------- .../kageru/kagebot/features/TimeoutFeature.kt | 16 ++++++++++------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/moe/kageru/kagebot/extensions/ArrowExtensions.kt b/src/main/kotlin/moe/kageru/kagebot/extensions/ArrowExtensions.kt index ce3ea53..fe3d43d 100644 --- a/src/main/kotlin/moe/kageru/kagebot/extensions/ArrowExtensions.kt +++ b/src/main/kotlin/moe/kageru/kagebot/extensions/ArrowExtensions.kt @@ -1,11 +1,10 @@ package moe.kageru.kagebot.extensions +import arrow.Kind import arrow.core.Either -import arrow.core.Option import arrow.core.Tuple3 import arrow.core.getOrElse -import arrow.optics.pFirst -import arrow.optics.pSecond +import arrow.typeclasses.Functor fun Either.on(op: (R) -> Unit): Either { this.map { op(it) } @@ -14,10 +13,10 @@ fun Either.on(op: (R) -> Unit): Either { fun Either<*, T>.unwrap(): T = getOrElse { error("Attempted to unwrap Either.left") } -fun Tuple3.mapSecond(op: (B) -> Option): Option> { - return op(this.b).map { Tuple3.pSecond().set(this, it) } +fun Tuple3.mapFirst(AP: Functor, op: (A) -> Kind) = let { (a, b, c) -> + AP.run { op(a).map { Tuple3(it, b, c) } } } -fun Tuple3.mapFirst(op: (A) -> Option): Option> { - return op(this.a).map { Tuple3.pFirst().set(this, it) } +fun Tuple3.mapSecond(AP: Functor, op: (B) -> Kind) = let { (a, b, c) -> + AP.run { op(b).map { Tuple3(a, it, c) } } } diff --git a/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt b/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt index 238c9a8..326ebfb 100644 --- a/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt +++ b/src/main/kotlin/moe/kageru/kagebot/features/TimeoutFeature.kt @@ -1,11 +1,12 @@ package moe.kageru.kagebot.features -import arrow.core.Either -import arrow.core.Tuple3 +import arrow.Kind +import arrow.core.* +import arrow.core.extensions.either.applicative.applicative import arrow.core.extensions.either.monad.flatMap import arrow.core.extensions.list.monad.map import arrow.core.extensions.listk.functorFilter.filter -import arrow.core.toOption +import arrow.core.extensions.option.applicative.applicative import arrow.syntax.collections.destructured import com.fasterxml.jackson.annotation.JsonProperty import moe.kageru.kagebot.Log @@ -32,13 +33,16 @@ class TimeoutFeature(@JsonProperty("role") role: String) : MessageFeature { { Tuple3(args[1], args[2], args.getOrNull(3)) }, { "Error: expected “