Skip to content

Commit

Permalink
add fluent copy-like functions
Browse files Browse the repository at this point in the history
  • Loading branch information
bkosm committed Nov 23, 2022
1 parent 57e1519 commit 731e6cb
Show file tree
Hide file tree
Showing 3 changed files with 205 additions and 1 deletion.
77 changes: 76 additions & 1 deletion src/main/kotlin/com/bkosm/ktuple/Tuple.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.bkosm.ktuple

@Suppress("FunctionName")
sealed class Tuple private constructor(vararg elements: Any?) : Collection<Any?> {
private val orderedValues = elements.toList()

Expand Down Expand Up @@ -71,60 +72,134 @@ sealed class Tuple private constructor(vararg elements: Any?) : Collection<Any?>
data class Of1<T1>(
val _1: T1
) : Tuple(_1) {
fun <NEW> _1(new: NEW) = Companion(new)

companion object
}

data class Of2<T1, T2>(
val _1: T1, val _2: T2
) : Tuple(_1, _2) {
fun <NEW> _1(new: NEW) = Companion(new, _2)
fun <NEW> _2(new: NEW) = Companion(_1, new)

companion object
}

data class Of3<T1, T2, T3>(
val _1: T1, val _2: T2, val _3: T3
) : Tuple(_1, _2, _3) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new)

companion object
}

data class Of4<T1, T2, T3, T4>(
val _1: T1, val _2: T2, val _3: T3, val _4: T4
) : Tuple(_1, _2, _3, _4) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3, _4)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3, _4)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new, _4)
fun <NEW> _4(new: NEW) = Companion(_1, _2, _3, new)

companion object
}

data class Of5<T1, T2, T3, T4, T5>(
val _1: T1, val _2: T2, val _3: T3, val _4: T4, val _5: T5
) : Tuple(_1, _2, _3, _4, _5) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3, _4, _5)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3, _4, _5)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new, _4, _5)
fun <NEW> _4(new: NEW) = Companion(_1, _2, _3, new, _5)
fun <NEW> _5(new: NEW) = Companion(_1, _2, _3, _4, new)

companion object
}

data class Of6<T1, T2, T3, T4, T5, T6>(
val _1: T1, val _2: T2, val _3: T3, val _4: T4, val _5: T5, val _6: T6
) : Tuple(_1, _2, _3, _4, _5, _6) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3, _4, _5, _6)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3, _4, _5, _6)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new, _4, _5, _6)
fun <NEW> _4(new: NEW) = Companion(_1, _2, _3, new, _5, _6)
fun <NEW> _5(new: NEW) = Companion(_1, _2, _3, _4, new, _6)
fun <NEW> _6(new: NEW) = Companion(_1, _2, _3, _4, _5, new)

companion object
}

data class Of7<T1, T2, T3, T4, T5, T6, T7>(
val _1: T1, val _2: T2, val _3: T3, val _4: T4, val _5: T5, val _6: T6, val _7: T7
) : Tuple(_1, _2, _3, _4, _5, _6, _7) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3, _4, _5, _6, _7)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3, _4, _5, _6, _7)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new, _4, _5, _6, _7)
fun <NEW> _4(new: NEW) = Companion(_1, _2, _3, new, _5, _6, _7)
fun <NEW> _5(new: NEW) = Companion(_1, _2, _3, _4, new, _6, _7)
fun <NEW> _6(new: NEW) = Companion(_1, _2, _3, _4, _5, new, _7)
fun <NEW> _7(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, new)

companion object
}

data class Of8<T1, T2, T3, T4, T5, T6, T7, T8>(
val _1: T1, val _2: T2, val _3: T3, val _4: T4, val _5: T5, val _6: T6, val _7: T7, val _8: T8
) : Tuple(_1, _2, _3, _4, _5, _6, _7, _8) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3, _4, _5, _6, _7, _8)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3, _4, _5, _6, _7, _8)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new, _4, _5, _6, _7, _8)
fun <NEW> _4(new: NEW) = Companion(_1, _2, _3, new, _5, _6, _7, _8)
fun <NEW> _5(new: NEW) = Companion(_1, _2, _3, _4, new, _6, _7, _8)
fun <NEW> _6(new: NEW) = Companion(_1, _2, _3, _4, _5, new, _7, _8)
fun <NEW> _7(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, new, _8)
fun <NEW> _8(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, _7, new)

companion object
}

data class Of9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
val _1: T1, val _2: T2, val _3: T3, val _4: T4, val _5: T5, val _6: T6, val _7: T7, val _8: T8, val _9: T9
) : Tuple(_1, _2, _3, _4, _5, _6, _7, _8, _9) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3, _4, _5, _6, _7, _8, _9)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3, _4, _5, _6, _7, _8, _9)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new, _4, _5, _6, _7, _8, _9)
fun <NEW> _4(new: NEW) = Companion(_1, _2, _3, new, _5, _6, _7, _8, _9)
fun <NEW> _5(new: NEW) = Companion(_1, _2, _3, _4, new, _6, _7, _8, _9)
fun <NEW> _6(new: NEW) = Companion(_1, _2, _3, _4, _5, new, _7, _8, _9)
fun <NEW> _7(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, new, _8, _9)
fun <NEW> _8(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, _7, new, _9)
fun <NEW> _9(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, _7, _8, new)

companion object
}

data class Of10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
val _1: T1, val _2: T2, val _3: T3, val _4: T4, val _5: T5, val _6: T6, val _7: T7, val _8: T8, val _9: T9, val _10: T10
val _1: T1,
val _2: T2,
val _3: T3,
val _4: T4,
val _5: T5,
val _6: T6,
val _7: T7,
val _8: T8,
val _9: T9,
val _10: T10
) : Tuple(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) {
fun <NEW> _1(new: NEW) = Companion(new, _2, _3, _4, _5, _6, _7, _8, _9, _10)
fun <NEW> _2(new: NEW) = Companion(_1, new, _3, _4, _5, _6, _7, _8, _9, _10)
fun <NEW> _3(new: NEW) = Companion(_1, _2, new, _4, _5, _6, _7, _8, _9, _10)
fun <NEW> _4(new: NEW) = Companion(_1, _2, _3, new, _5, _6, _7, _8, _9, _10)
fun <NEW> _5(new: NEW) = Companion(_1, _2, _3, _4, new, _6, _7, _8, _9, _10)
fun <NEW> _6(new: NEW) = Companion(_1, _2, _3, _4, _5, new, _7, _8, _9, _10)
fun <NEW> _7(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, new, _8, _9, _10)
fun <NEW> _8(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, _7, new, _9, _10)
fun <NEW> _9(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, _7, _8, new, _10)
fun <NEW> _10(new: NEW) = Companion(_1, _2, _3, _4, _5, _6, _7, _8, _9, new)

companion object
}
}
122 changes: 122 additions & 0 deletions src/test/kotlin/com/bkosm/ktuple/CopyTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package com.bkosm.ktuple

import org.junit.jupiter.api.Test
import kotlin.test.expect

@Suppress("TestFunctionName")
internal class CopyTest {
@Test
fun Of1() {
val uut = t(1)

expect(t("hey")) { uut._1("hey") }
}

@Test
fun Of2() {
val uut = t(1, 2.0)

expect(t("hey", 2.0)) { uut._1("hey") }
expect(t(1, "hey")) { uut._2("hey") }
}

@Test
fun Of3() {
val uut = t(1, 2.0, 3L)

expect(t("hey", 2.0, 3L)) { uut._1("hey") }
expect(t(1, "hey", 3L)) { uut._2("hey") }
expect(t(1, 2.0, "hey")) { uut._3("hey") }
}

@Test
fun Of4() {
val uut = t(1, 2.0, 3L, 1)

expect(t("hey", 2.0, 3L, 1)) { uut._1("hey") }
expect(t(1, "hey", 3L, 1)) { uut._2("hey") }
expect(t(1, 2.0, "hey", 1)) { uut._3("hey") }
expect(t(1, 2.0, 3L, "hey")) { uut._4("hey") }
}

@Test
fun Of5() {
val uut = t(1, 2.0, 3L, 1, 2.0)

expect(t("hey", 2.0, 3L, 1, 2.0)) { uut._1("hey") }
expect(t(1, "hey", 3L, 1, 2.0)) { uut._2("hey") }
expect(t(1, 2.0, "hey", 1, 2.0)) { uut._3("hey") }
expect(t(1, 2.0, 3L, "hey", 2.0)) { uut._4("hey") }
expect(t(1, 2.0, 3L, 1, "hey")) { uut._5("hey") }
}

@Test
fun Of6() {
val uut = t(1, 2.0, 3L, 1, 2.0, 3L)

expect(t("hey", 2.0, 3L, 1, 2.0, 3L)) { uut._1("hey") }
expect(t(1, "hey", 3L, 1, 2.0, 3L)) { uut._2("hey") }
expect(t(1, 2.0, "hey", 1, 2.0, 3L)) { uut._3("hey") }
expect(t(1, 2.0, 3L, "hey", 2.0, 3L)) { uut._4("hey") }
expect(t(1, 2.0, 3L, 1, "hey", 3L)) { uut._5("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, "hey")) { uut._6("hey") }
}

@Test
fun Of7() {
val uut = t(1, 2.0, 3L, 1, 2.0, 3L, 1)

expect(t("hey", 2.0, 3L, 1, 2.0, 3L, 1)) { uut._1("hey") }
expect(t(1, "hey", 3L, 1, 2.0, 3L, 1)) { uut._2("hey") }
expect(t(1, 2.0, "hey", 1, 2.0, 3L, 1)) { uut._3("hey") }
expect(t(1, 2.0, 3L, "hey", 2.0, 3L, 1)) { uut._4("hey") }
expect(t(1, 2.0, 3L, 1, "hey", 3L, 1)) { uut._5("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, "hey", 1)) { uut._6("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, "hey")) { uut._7("hey") }
}

@Test
fun Of8() {
val uut = t(1, 2.0, 3L, 1, 2.0, 3L, 1, 2.0)

expect(t("hey", 2.0, 3L, 1, 2.0, 3L, 1, 2.0)) { uut._1("hey") }
expect(t(1, "hey", 3L, 1, 2.0, 3L, 1, 2.0)) { uut._2("hey") }
expect(t(1, 2.0, "hey", 1, 2.0, 3L, 1, 2.0)) { uut._3("hey") }
expect(t(1, 2.0, 3L, "hey", 2.0, 3L, 1, 2.0)) { uut._4("hey") }
expect(t(1, 2.0, 3L, 1, "hey", 3L, 1, 2.0)) { uut._5("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, "hey", 1, 2.0)) { uut._6("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, "hey", 2.0)) { uut._7("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, 1, "hey")) { uut._8("hey") }
}

@Test
fun Of9() {
val uut = t(1, 2.0, 3L, 1, 2.0, 3L, 1, 2.0, 3L)

expect(t("hey", 2.0, 3L, 1, 2.0, 3L, 1, 2.0, 3L)) { uut._1("hey") }
expect(t(1, "hey", 3L, 1, 2.0, 3L, 1, 2.0, 3L)) { uut._2("hey") }
expect(t(1, 2.0, "hey", 1, 2.0, 3L, 1, 2.0, 3L)) { uut._3("hey") }
expect(t(1, 2.0, 3L, "hey", 2.0, 3L, 1, 2.0, 3L)) { uut._4("hey") }
expect(t(1, 2.0, 3L, 1, "hey", 3L, 1, 2.0, 3L)) { uut._5("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, "hey", 1, 2.0, 3L)) { uut._6("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, "hey", 2.0, 3L)) { uut._7("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, 1, "hey", 3L)) { uut._8("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, 1, 2.0, "hey")) { uut._9("hey") }
}

@Test
fun Of10() {
val uut = t(1, 2.0, 3L, 1, 2.0, 3L, 1, 2.0, 3L, 1)

expect(t("hey", 2.0, 3L, 1, 2.0, 3L, 1, 2.0, 3L, 1)) { uut._1("hey") }
expect(t(1, "hey", 3L, 1, 2.0, 3L, 1, 2.0, 3L, 1)) { uut._2("hey") }
expect(t(1, 2.0, "hey", 1, 2.0, 3L, 1, 2.0, 3L, 1)) { uut._3("hey") }
expect(t(1, 2.0, 3L, "hey", 2.0, 3L, 1, 2.0, 3L, 1)) { uut._4("hey") }
expect(t(1, 2.0, 3L, 1, "hey", 3L, 1, 2.0, 3L, 1)) { uut._5("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, "hey", 1, 2.0, 3L, 1)) { uut._6("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, "hey", 2.0, 3L, 1)) { uut._7("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, 1, "hey", 3L, 1)) { uut._8("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, 1, 2.0, "hey", 1)) { uut._9("hey") }
expect(t(1, 2.0, 3L, 1, 2.0, 3L, 1, 2.0, 3L, "hey")) { uut._10("hey") }
}
}
7 changes: 7 additions & 0 deletions src/test/kotlin/com/bkosm/ktuple/TupleTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,13 @@ internal class TupleTest {
expect(t(1, 3.0)) { uut.copy(_2 = 3.0) }
}

@Test
fun `you can do a copy with type change through a member function when the full type is present`() {
val uut: Tuple.Of2<Int, Double> = t(1, 2.0)

expect(t(null, "hey!")) { uut._2("hey!")._1(null) }
}

@Test
fun `plus operator converts tuples into a list`() {
val res = uut + t(2, 3) + t(4.0) + listOf(5f)
Expand Down

0 comments on commit 731e6cb

Please sign in to comment.