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