Skip to content

Commit 7cc2e80

Browse files
Merge pull request #44
triple tuples data structure
2 parents 8a9d9f1 + a6f0473 commit 7cc2e80

2 files changed

Lines changed: 458 additions & 0 deletions

File tree

  • library/src
    • commonMain/kotlin/com/benromdhane/omar/offroadsoft/monad/tuple
    • commonTest/kotlin/com/benromdhane/omar/offroadsoft/monad/tuple
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
package com.benromdhane.omar.offroadsoft.monad.tuple
2+
3+
data class Triple<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any>(
4+
val firstElement: FIRST_ELEMENT,
5+
val secondElement: SECOND_ELEMENT,
6+
val thirdElement: THIRD_ELEMENT
7+
) {
8+
9+
fun <NEW_FIRST_ELEMENT : Any> mapFirst(
10+
mapper: (FIRST_ELEMENT) -> NEW_FIRST_ELEMENT
11+
) =
12+
Triple(
13+
mapper(this.firstElement),
14+
this.secondElement,
15+
this.thirdElement
16+
)
17+
18+
fun <NEW_SECOND_ELEMENT : Any> mapSecond(
19+
mapper: (SECOND_ELEMENT) -> NEW_SECOND_ELEMENT
20+
) =
21+
Triple(
22+
this.firstElement,
23+
mapper(this.secondElement),
24+
this.thirdElement
25+
)
26+
27+
fun <NEW_THIRD_ELEMENT : Any> mapThird(
28+
mapper: (THIRD_ELEMENT) -> NEW_THIRD_ELEMENT
29+
) =
30+
Triple(
31+
this.firstElement,
32+
this.secondElement,
33+
mapper(this.thirdElement)
34+
)
35+
36+
fun switchFirstAndSecondElements() =
37+
Triple(
38+
this.secondElement,
39+
this.firstElement,
40+
this.thirdElement
41+
)
42+
43+
fun switchFirstAndThirdElements() =
44+
Triple(
45+
this.thirdElement,
46+
this.secondElement,
47+
this.firstElement
48+
)
49+
50+
fun switchSecondAndThirdElements() =
51+
Triple(
52+
this.firstElement,
53+
this.thirdElement,
54+
this.secondElement
55+
)
56+
57+
fun toPair() =
58+
Pair.of(
59+
this.firstElement,
60+
this.secondElement
61+
)
62+
63+
fun <RESULT> transform(
64+
transformer: (FIRST_ELEMENT, SECOND_ELEMENT, THIRD_ELEMENT) -> RESULT
65+
) =
66+
transformer(
67+
this.firstElement,
68+
this.secondElement,
69+
this.thirdElement
70+
)
71+
72+
fun <RESULT> transform(
73+
transformer: (FIRST_ELEMENT, SECOND_ELEMENT) -> RESULT
74+
) =
75+
transformer(
76+
this.firstElement,
77+
this.secondElement
78+
)
79+
80+
companion object Builder {
81+
82+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> of(
83+
firstElement: FIRST_ELEMENT,
84+
secondElement: SECOND_ELEMENT,
85+
thirdElement: THIRD_ELEMENT
86+
) =
87+
Triple(
88+
firstElement,
89+
secondElement,
90+
thirdElement
91+
)
92+
93+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> of(
94+
firstElement: () -> FIRST_ELEMENT,
95+
secondElement: () -> SECOND_ELEMENT,
96+
thirdElement: () -> THIRD_ELEMENT
97+
) =
98+
Triple(
99+
firstElement(),
100+
secondElement(),
101+
thirdElement()
102+
)
103+
}
104+
105+
class Factory<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> private constructor() {
106+
107+
fun first(
108+
firstElement: FIRST_ELEMENT
109+
) =
110+
SecondFactory
111+
.instance<_, SECOND_ELEMENT, THIRD_ELEMENT>(
112+
firstElement
113+
)
114+
115+
companion object Builder {
116+
117+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> instance() =
118+
Factory<FIRST_ELEMENT, SECOND_ELEMENT, THIRD_ELEMENT>()
119+
}
120+
121+
class SecondFactory<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> private constructor(
122+
private val firstElement: FIRST_ELEMENT
123+
) {
124+
125+
fun second(
126+
secondElement: SECOND_ELEMENT
127+
) =
128+
ThirdFactory
129+
.instance<_, _, THIRD_ELEMENT>(
130+
this.firstElement,
131+
secondElement
132+
)
133+
134+
internal companion object Builder {
135+
136+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> instance(
137+
firstElement: FIRST_ELEMENT
138+
) =
139+
SecondFactory<_, SECOND_ELEMENT, THIRD_ELEMENT>(
140+
firstElement
141+
)
142+
}
143+
144+
class ThirdFactory<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> private constructor(
145+
private val firstElement: FIRST_ELEMENT,
146+
private val secondElement: SECOND_ELEMENT
147+
) {
148+
149+
fun third(
150+
thirdElement: THIRD_ELEMENT
151+
) =
152+
of(
153+
this.firstElement,
154+
this.secondElement,
155+
thirdElement
156+
)
157+
158+
internal companion object Builder {
159+
160+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> instance(
161+
firstElement: FIRST_ELEMENT,
162+
secondElement: SECOND_ELEMENT
163+
) =
164+
ThirdFactory<_, _, THIRD_ELEMENT>(
165+
firstElement,
166+
secondElement
167+
)
168+
}
169+
}
170+
}
171+
}
172+
}
173+
174+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any> Pair<FIRST_ELEMENT, SECOND_ELEMENT>.toTriple(
175+
thirdElement: THIRD_ELEMENT
176+
) =
177+
Triple.of(
178+
this.firstElement,
179+
this.secondElement,
180+
thirdElement
181+
)

0 commit comments

Comments
 (0)