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