Skip to content

Commit 843d423

Browse files
Merge pull request #45
quadruple tuples data structure
2 parents 9c425ad + 16e63c1 commit 843d423

2 files changed

Lines changed: 784 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: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
package com.benromdhane.omar.offroadsoft.monad.tuple
2+
3+
data class Quadruple<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any>(
4+
val firstElement: FIRST_ELEMENT,
5+
val secondElement: SECOND_ELEMENT,
6+
val thirdElement: THIRD_ELEMENT,
7+
val fourthElement: FOURTH_ELEMENT
8+
) {
9+
10+
fun <NEW_FIRST_ELEMENT : Any> mapFirst(
11+
mapper: (FIRST_ELEMENT) -> NEW_FIRST_ELEMENT
12+
) =
13+
Quadruple(
14+
mapper(this.firstElement),
15+
this.secondElement,
16+
this.thirdElement,
17+
this.fourthElement
18+
)
19+
20+
fun <NEW_SECOND_ELEMENT : Any> mapSecond(
21+
mapper: (SECOND_ELEMENT) -> NEW_SECOND_ELEMENT
22+
) =
23+
Quadruple(
24+
this.firstElement,
25+
mapper(this.secondElement),
26+
this.thirdElement,
27+
this.fourthElement
28+
)
29+
30+
fun <NEW_THIRD_ELEMENT : Any> mapThird(
31+
mapper: (THIRD_ELEMENT) -> NEW_THIRD_ELEMENT
32+
) =
33+
Quadruple(
34+
this.firstElement,
35+
this.secondElement,
36+
mapper(this.thirdElement),
37+
this.fourthElement
38+
)
39+
40+
fun <NEW_FOURTH_ELEMENT : Any> mapFourth(
41+
mapper: (FOURTH_ELEMENT) -> NEW_FOURTH_ELEMENT
42+
) =
43+
Quadruple(
44+
this.firstElement,
45+
this.secondElement,
46+
this.thirdElement,
47+
mapper(this.fourthElement)
48+
)
49+
50+
fun switchFirstAndSecondElements() =
51+
Quadruple(
52+
this.secondElement,
53+
this.firstElement,
54+
this.thirdElement,
55+
this.fourthElement
56+
)
57+
58+
fun switchFirstAndThirdElements() =
59+
Quadruple(
60+
this.thirdElement,
61+
this.secondElement,
62+
this.firstElement,
63+
this.fourthElement
64+
)
65+
66+
fun switchFirstAndFourthElements() =
67+
Quadruple(
68+
this.fourthElement,
69+
this.secondElement,
70+
this.thirdElement,
71+
this.firstElement
72+
)
73+
74+
fun switchSecondAndThirdElements() =
75+
Quadruple(
76+
this.firstElement,
77+
this.thirdElement,
78+
this.secondElement,
79+
this.fourthElement
80+
)
81+
82+
fun switchSecondAndFourthElements() =
83+
Quadruple(
84+
this.firstElement,
85+
this.fourthElement,
86+
this.thirdElement,
87+
this.secondElement
88+
)
89+
90+
fun switchThirdAndFourthElements() =
91+
Quadruple(
92+
this.firstElement,
93+
this.secondElement,
94+
this.fourthElement,
95+
this.thirdElement
96+
)
97+
98+
fun toTriple() =
99+
Triple.of(
100+
this.firstElement,
101+
this.secondElement,
102+
this.thirdElement
103+
)
104+
105+
fun toPair() =
106+
Pair.of(
107+
this.firstElement,
108+
this.secondElement
109+
)
110+
111+
fun <RESULT> transform(
112+
transformer: (FIRST_ELEMENT, SECOND_ELEMENT, THIRD_ELEMENT, FOURTH_ELEMENT) -> RESULT
113+
) =
114+
transformer(
115+
this.firstElement,
116+
this.secondElement,
117+
this.thirdElement,
118+
this.fourthElement
119+
)
120+
121+
fun <RESULT> transform(
122+
transformer: (FIRST_ELEMENT, SECOND_ELEMENT, THIRD_ELEMENT) -> RESULT
123+
) =
124+
transformer(
125+
this.firstElement,
126+
this.secondElement,
127+
this.thirdElement
128+
)
129+
130+
fun <RESULT> transform(
131+
transformer: (FIRST_ELEMENT, SECOND_ELEMENT) -> RESULT
132+
) =
133+
transformer(
134+
this.firstElement,
135+
this.secondElement
136+
)
137+
138+
companion object Builder {
139+
140+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> of(
141+
firstElement: FIRST_ELEMENT,
142+
secondElement: SECOND_ELEMENT,
143+
thirdElement: THIRD_ELEMENT,
144+
fourthElement: FOURTH_ELEMENT
145+
) =
146+
Quadruple(
147+
firstElement,
148+
secondElement,
149+
thirdElement,
150+
fourthElement
151+
)
152+
153+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> of(
154+
firstElement: () -> FIRST_ELEMENT,
155+
secondElement: () -> SECOND_ELEMENT,
156+
thirdElement: () -> THIRD_ELEMENT,
157+
fourthElement: () -> FOURTH_ELEMENT
158+
) =
159+
Quadruple(
160+
firstElement(),
161+
secondElement(),
162+
thirdElement(),
163+
fourthElement()
164+
)
165+
}
166+
167+
class Factory<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> private constructor() {
168+
169+
fun first(
170+
firstElement: FIRST_ELEMENT
171+
) =
172+
SecondFactory
173+
.instance<_, SECOND_ELEMENT, THIRD_ELEMENT, FOURTH_ELEMENT>(
174+
firstElement
175+
)
176+
177+
companion object Builder {
178+
179+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> instance() =
180+
Factory<FIRST_ELEMENT, SECOND_ELEMENT, THIRD_ELEMENT, FOURTH_ELEMENT>()
181+
}
182+
183+
class SecondFactory<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> private constructor(
184+
private val firstElement: FIRST_ELEMENT
185+
) {
186+
187+
fun second(
188+
secondElement: SECOND_ELEMENT
189+
) =
190+
ThirdFactory
191+
.instance<_, _, THIRD_ELEMENT, FOURTH_ELEMENT>(
192+
this.firstElement,
193+
secondElement
194+
)
195+
196+
internal companion object Builder {
197+
198+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> instance(
199+
firstElement: FIRST_ELEMENT
200+
) =
201+
SecondFactory<_, SECOND_ELEMENT, THIRD_ELEMENT, FOURTH_ELEMENT>(
202+
firstElement
203+
)
204+
}
205+
206+
class ThirdFactory<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> private constructor(
207+
private val firstElement: FIRST_ELEMENT,
208+
private val secondElement: SECOND_ELEMENT
209+
) {
210+
211+
fun third(
212+
thirdElement: THIRD_ELEMENT
213+
) =
214+
FourthFactory
215+
.instance<_, _, _, FOURTH_ELEMENT>(
216+
this.firstElement,
217+
this.secondElement,
218+
thirdElement
219+
)
220+
221+
internal companion object Builder {
222+
223+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> instance(
224+
firstElement: FIRST_ELEMENT,
225+
secondElement: SECOND_ELEMENT
226+
) =
227+
ThirdFactory<_, _, THIRD_ELEMENT, FOURTH_ELEMENT>(
228+
firstElement,
229+
secondElement
230+
)
231+
}
232+
233+
class FourthFactory<FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> private constructor(
234+
private val firstElement: FIRST_ELEMENT,
235+
private val secondElement: SECOND_ELEMENT,
236+
private val thirdElement: THIRD_ELEMENT
237+
) {
238+
239+
fun fourth(
240+
fourthElement: FOURTH_ELEMENT
241+
) =
242+
of(
243+
this.firstElement,
244+
this.secondElement,
245+
this.thirdElement,
246+
fourthElement
247+
)
248+
249+
internal companion object Builder {
250+
251+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> instance(
252+
firstElement: FIRST_ELEMENT,
253+
secondElement: SECOND_ELEMENT,
254+
thirdElement: THIRD_ELEMENT
255+
) =
256+
FourthFactory<_, _, _, FOURTH_ELEMENT>(
257+
firstElement,
258+
secondElement,
259+
thirdElement
260+
)
261+
}
262+
}
263+
}
264+
}
265+
}
266+
}
267+
268+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> Triple<FIRST_ELEMENT, SECOND_ELEMENT, THIRD_ELEMENT>.toQuadruple(
269+
fourthElement: FOURTH_ELEMENT
270+
) =
271+
Quadruple.of(
272+
this.firstElement,
273+
this.secondElement,
274+
this.thirdElement,
275+
fourthElement
276+
)
277+
278+
fun <FIRST_ELEMENT : Any, SECOND_ELEMENT : Any, THIRD_ELEMENT : Any, FOURTH_ELEMENT : Any> Pair<FIRST_ELEMENT, SECOND_ELEMENT>.toQuadruple(
279+
thirdElement: THIRD_ELEMENT,
280+
fourthElement: FOURTH_ELEMENT
281+
) =
282+
Quadruple.of(
283+
this.firstElement,
284+
this.secondElement,
285+
thirdElement,
286+
fourthElement
287+
)

0 commit comments

Comments
 (0)