Nir
09/09/2020, 8:19 PM%=
to avoid repeating the variable name, when using a lens to modify something? Current we have something like:
var longVariableName = Foo(Bar(Baz(5)))
longVariableName = Foo.bar.baz.int.modify(longVariableName) { 20 }
Instead, it would be possible to do:
longVariableName %= <http://Foo.bar.baz.int|Foo.bar.baz.int> { 20 }
Obviously any augmented operator works, I just chose modulus, because modulus -> mod -> modify đNir
09/09/2020, 8:48 PMNir
09/09/2020, 8:48 PMpackage foo
import arrow.optics.*
@optics data class Frob(val bar: Bar) { companion object }
@optics data class Bar(val baz: Baz) { companion object }
@optics data class Baz(val int: Int) { companion object }
class Modifier<T, U>(val lens: Lens<T, U>, val f: (U) -> U)
operator fun<T, U> Lens<T, U>.invoke(f: (U) -> U) = Modifier(this, f)
operator fun<T, U> T.rem(modifier: Modifier<T, U>) = modifier.lens.modify(this, modifier.f)
pakoito
09/09/2020, 10:21 PMpakoito
09/09/2020, 10:22 PMpakoito
09/09/2020, 10:22 PMNir
09/09/2020, 10:33 PMNir
09/09/2020, 10:34 PMNir
09/09/2020, 10:34 PMNir
09/09/2020, 10:35 PMNir
09/09/2020, 10:37 PMNir
09/09/2020, 10:38 PMlongVariableName %= <http://Foo.bar.baz.int|Foo.bar.baz.int> { 20 } + Foo.bar.baz.string { "hello" }
Nir
09/09/2020, 10:38 PMNir
09/09/2020, 10:40 PMNir
09/09/2020, 11:58 PMclass Modifier<T>(val f: (T) -> T)
operator fun<T, U> Lens<T, U>.invoke(f: (U) -> U) = Modifier<T> { this.modify(it, f) }
operator fun<T> T.rem(modifier: Modifier<T>) = modifier.f(this)
operator fun<T> Modifier<T>.plus(modifier: Modifier<T>) = Modifier<T>({ modifier.f(this.f(it)) })
Nir
09/09/2020, 11:59 PMvar x = Frob(Bar(Baz(5, "hello")))
x %= <http://Frob.bar.baz.int|Frob.bar.baz.int> { 15 } + Frob.bar.baz.string { "bye" }
println(x)
Nir
09/09/2020, 11:59 PMpakoito
09/10/2020, 12:03 AMT -> T
?pakoito
09/10/2020, 12:03 AMpakoito
09/10/2020, 12:04 AMoperator fun<T, U> Lens<T, U>.invoke(f: (U) -> U) = { this.modify(it, f) }
operator fun<T> T.rem(modifier: (T) -> T) = modifier.f(this)
operator fun<T> ((T) -> T).plus(modifier: (T) -> T) = this compose modifier
Nir
09/10/2020, 12:05 AMpakoito
09/10/2020, 12:05 AMpakoito
09/10/2020, 12:05 AMx %= <http://Frob.bar.baz.int|Frob.bar.baz.int> { 15 } compose Frob.bar.baz.string { âbyeâ }
Nir
09/10/2020, 12:05 AMNir
09/10/2020, 12:05 AMNir
09/10/2020, 12:05 AMNir
09/10/2020, 12:06 AMpakoito
09/10/2020, 12:06 AMpakoito
09/10/2020, 12:06 AMNir
09/10/2020, 12:06 AMpakoito
09/10/2020, 12:07 AMpakoito
09/10/2020, 12:07 AMpakoito
09/10/2020, 12:07 AMNir
09/10/2020, 12:07 AMNir
09/10/2020, 12:07 AMpakoito
09/10/2020, 12:08 AMNir
09/10/2020, 12:08 AMpakoito
09/10/2020, 12:08 AMNir
09/10/2020, 12:08 AMNir
09/10/2020, 12:08 AMpakoito
09/10/2020, 12:09 AMpakoito
09/10/2020, 12:09 AMpakoito
09/10/2020, 12:09 AMpakoito
09/10/2020, 12:09 AMNir
09/10/2020, 12:09 AMNir
09/10/2020, 12:10 AMNir
09/10/2020, 12:10 AMNir
09/10/2020, 12:10 AMNir
09/10/2020, 12:11 AMpakoito
09/10/2020, 12:11 AMNir
09/10/2020, 12:11 AMNir
09/10/2020, 12:11 AMpakoito
09/10/2020, 12:11 AMpakoito
09/10/2020, 12:11 AMNir
09/10/2020, 12:11 AMpakoito
09/10/2020, 12:12 AMNir
09/10/2020, 12:12 AMpakoito
09/10/2020, 12:12 AMNir
09/10/2020, 12:12 AMNir
09/10/2020, 12:13 AMNir
09/10/2020, 12:14 AMraulraja
09/10/2020, 7:45 AMNir
09/10/2020, 2:10 PMNir
09/10/2020, 2:11 PMin Java/Kotlin operator overload beyond the basics is frowned uponWell, Java does not have operator overloading, unless they added it recently? In Kotlin, I guess basics are relative đ Kotlin's
-
for lists is really bizarre, IMHO. I've never seen that in any other language.raulraja
09/10/2020, 10:31 PMNir
09/10/2020, 10:31 PMraulraja
09/10/2020, 11:03 PM