@@ -49,7 +49,15 @@ sealed abstract class Maybe[+A] extends Equals {
49
49
50
50
def foreach (f : A => Unit ): Unit
51
51
52
- def fold [T ](onJust : => T , onNil : => T , onFailed : => T ): T
52
+ def fold [T ](onJust : (A ) => T )(onNoVal : => T )(onFailed : (Failed ) => T ): T
53
+
54
+ @ inline
55
+ final def fold_ [T ](onJust : => T )(onNoVal : => T )(onFailed : => T ): T =
56
+ fold(a => onJust)(onNoVal)(f => onFailed)
57
+
58
+ @ inline
59
+ final def foldJust [T ](onJust : (A ) => T )(onOther : => T ): T =
60
+ fold(onJust)(onOther)(f => onOther)
53
61
54
62
@ inline
55
63
final def forJust [B >: A ](f : Just [A ] => Maybe [B ]): Maybe [B ] =
@@ -60,8 +68,8 @@ sealed abstract class Maybe[+A] extends Equals {
60
68
if (isNoVal) f else this
61
69
62
70
@ inline
63
- final def forFailed [B >: A , T , S ](f : Failed [ T ] => Maybe [B ]): Maybe [B ] =
64
- if (isFailed) f(this .asInstanceOf [Failed [ T ] ]) else this
71
+ final def forFailed [B >: A ](f : Failed => Maybe [B ]): Maybe [B ] =
72
+ if (isFailed) f(this .asInstanceOf [Failed ]) else this
65
73
66
74
def canEqual (that : Any ): Boolean = that match {
67
75
case _ : Maybe [_] => true
@@ -77,7 +85,7 @@ sealed abstract class Maybe[+A] extends Equals {
77
85
}
78
86
79
87
object Maybe {
80
- type AnyFailure = Failed [_]
88
+ type AnyFailure = Failed
81
89
val MaybeEmptyIterator : Iterator [Nothing ] = Iterator ()
82
90
val MaybeEmptyTraversable : Traversable [Nothing ] = Traversable ()
83
91
val MaybeEmptyList : List [Nothing ] = List ()
@@ -100,20 +108,11 @@ object Maybe {
100
108
case _ => Just (value)
101
109
}
102
110
} catch {
103
- case e : Throwable => Failed (Some ( " Maybe() failed" ), Just (e), NoVal , NoVal )
111
+ case e : Throwable => Failed (e, " Maybe() failed" )
104
112
}
105
113
}
106
114
}
107
115
108
- // object Just {
109
- // def apply[A](x: => A): Maybe[A] = Maybe(x)
110
- //
111
- // def unapply[A](x: A): Option[A] = x match {
112
- // case null => None
113
- // case _ => Some(x)
114
- // }
115
- // }
116
-
117
116
final case class Just [@ specialized(Boolean , Char , Int , Double ) + A ](get : A ) extends Maybe [A ] {
118
117
def toIterator = Iterator (get)
119
118
def toTraversable = Traversable (get)
@@ -126,8 +125,7 @@ final case class Just[@specialized(Boolean, Char, Int, Double) +A](get: A) exten
126
125
127
126
def getOr [B >: A ](b : => B ) = get
128
127
129
- def fold [T ](onJust : => T , onNil : => T , onFailed : => T ): T =
130
- onJust
128
+ def fold [T ](onJust : (A ) => T )(onOnVal : => T )(onFailed : (Failed ) => T ) = onJust(get)
131
129
132
130
def || [B >: A ](f : => Maybe [B ]) = this
133
131
@@ -138,7 +136,7 @@ final case class Just[@specialized(Boolean, Char, Int, Double) +A](get: A) exten
138
136
139
137
protected def equalsImpl (that : Maybe [_]) = that match {
140
138
case Just (v) => v == get
141
- case _ => false
139
+ case _ => false
142
140
}
143
141
}
144
142
@@ -154,8 +152,7 @@ case object NoVal extends Maybe[Nothing] {
154
152
155
153
def getOr [B >: Nothing ](b : => B ) = b
156
154
157
- def fold [T ](onJust : => T , onNil : => T , onFailed : => T ): T =
158
- onNil
155
+ def fold [T ](onJust : (Nothing ) => T )(onNoVal : => T )(onFailed : (Failed )=> T ) = onNoVal
159
156
160
157
def || [B >: Nothing ](f : => Maybe [B ]) = f
161
158
@@ -170,14 +167,10 @@ case object NoVal extends Maybe[Nothing] {
170
167
}
171
168
}
172
169
173
- final case class Failed [T : Manifest ](
174
- message : Maybe [String ],
175
- exception : Maybe [Throwable ],
176
- cause : Maybe [Failed [_]],
177
- data : Maybe [T ]
178
- ) extends Maybe [Nothing ] {
179
-
180
- def typeOfData = manifest[T ]
170
+ /**
171
+ * A Maybe wrapper for an exception.
172
+ */
173
+ final case class Failed private [maybe](exception : Throwable , explanation : String ) extends Maybe [Nothing ] {
181
174
182
175
def isJust = false
183
176
def isNoVal = false
@@ -191,8 +184,7 @@ final case class Failed[T: Manifest](
191
184
192
185
def getOr [B >: Nothing ](b : => B ) = b
193
186
194
- def fold [T ](onJust : => T , onNil : => T , onFailed : => T ): T =
195
- onFailed
187
+ def fold [T ](onJust : (Nothing ) => T )(onNoVal : => T )(onFailed : (Failed )=> T ) = onFailed(this )
196
188
197
189
def || [B >: Nothing ](f : => Maybe [B ]) = f
198
190
@@ -202,12 +194,13 @@ final case class Failed[T: Manifest](
202
194
def foreach (f : Nothing => Unit ) = {}
203
195
204
196
protected def equalsImpl (that : Maybe [_]) = that match {
205
- case Failed (mO, eO, cO, dB) =>
206
- mO == message &&
207
- eO == exception &&
208
- cO == cause &&
209
- dB == data
197
+ case Failed (eO, ex0) => eO == exception && ex0 == explanation
210
198
case _ => false
211
199
}
212
200
}
213
201
202
+ object Failed {
203
+ def apply (exception : Throwable ): Failed = Failed (exception)
204
+ def apply (exception : Throwable , explanation : String , explanationArgs : Any * ): Failed =
205
+ Failed (exception, explanation.format(explanationArgs))
206
+ }
0 commit comments