17
17
package com .ckkloverdos .maybe
18
18
19
19
import collection .Iterator
20
- import java .util .Arrays
21
20
22
21
/**
23
22
* Inspired by Lift's `Box`, Haskell's `Maybe` and Scala's `Option`.
@@ -116,10 +115,10 @@ object MaybeEither {
116
115
def apply [A ](x : ⇒ A ): MaybeEither [A ] = Maybe (x) match {
117
116
case j@ Just (_) ⇒
118
117
j
119
- case f@ Failed (_, _, _ ) ⇒
118
+ case f@ Failed (_) ⇒
120
119
f
121
120
case NoVal ⇒
122
- Failed .from (new Exception (" Got NoVal for a MaybeFailed" ))
121
+ Failed (new Exception (" Got NoVal for a MaybeFailed" ))
123
122
}
124
123
}
125
124
@@ -141,7 +140,7 @@ object Maybe {
141
140
case _ ⇒ Just (value)
142
141
}
143
142
} catch {
144
- case e : Throwable ⇒ Failed .from (e)
143
+ case e : Throwable ⇒ Failed (e)
145
144
}
146
145
}
147
146
}
@@ -174,14 +173,28 @@ final case class Just[+A](get: A) extends MaybeOption[A] with MaybeEither[A] {
174
173
def || [B >: A ](f : ⇒ Maybe [B ]) = this
175
174
176
175
def map [B ](f : (A ) ⇒ B )= Maybe (f(get))
177
- def flatMap [B ](f : (A ) ⇒ Maybe [B ]) = f(get)
178
- def filter (f : (A ) ⇒ Boolean ): Maybe [A ] = if (f(get)) this else NoVal
176
+ def flatMap [B ](f : (A ) ⇒ Maybe [B ]) = {
177
+ try f(get)
178
+ catch {
179
+ case t : Throwable ⇒ Failed (t)
180
+ }
181
+ }
182
+ def filter (f : (A ) ⇒ Boolean ): Maybe [A ] = {
183
+ try {
184
+ if (f(get)) this else NoVal
185
+ } catch {
186
+ case t : Throwable ⇒ Failed (t)
187
+ }
188
+ }
179
189
def foreach (f : A ⇒ Unit ) = f(get)
180
190
181
191
def castTo [B <: AnyRef : Manifest ] = get match {
182
192
case null ⇒ NoVal
183
193
case value if (manifest[B ].erasure.isInstance(value)) ⇒ this .asInstanceOf [Maybe [B ]]
184
- case value ⇒ Failed .from(new ClassCastException (" %s -> %s" .format(get.getClass.getName, manifest[B ].erasure.getName)))
194
+ case value ⇒ Failed (
195
+ new ClassCastException (" %s -> %s" .format(
196
+ get.asInstanceOf [AnyRef ].getClass.getName,
197
+ manifest[B ].erasure.getName)))
185
198
}
186
199
187
200
def flatten1 [U ](implicit ev : A <:< Maybe [U ]): Maybe [U ] = ev(get)
@@ -225,12 +238,8 @@ case object NoVal extends MaybeOption[Nothing] {
225
238
/**
226
239
* A Maybe wrapper for an exception.
227
240
*/
228
- final case class Failed (failureType : String ,
229
- message : String = " " ,
230
- stackTrace : Array [StackTraceElement ] = Array ()) extends MaybeEither [Nothing ] {
231
- require(failureType ne null , " failureType is null" )
232
- require(message ne null , " message is null" )
233
- require(stackTrace ne null , " stackTrace is null" )
241
+ final case class Failed (exception : Throwable ) extends MaybeEither [Nothing ] {
242
+ require(exception ne null , " exception is null" )
234
243
235
244
def isJust = false
236
245
def isNoVal = false
@@ -264,27 +273,9 @@ final case class Failed(failureType: String,
264
273
override def equals (that : Any ) = {
265
274
that match {
266
275
case failed : Failed ⇒
267
- this .failureType == failed.failureType &&
268
- this .message == failed.message &&
269
- Arrays .equals(this .stackTrace.asInstanceOf [Array [AnyRef ]], failed.stackTrace.asInstanceOf [Array [AnyRef ]])
276
+ this .exception == failed.exception
270
277
case _ ⇒
271
278
false
272
279
}
273
280
}
274
- }
275
-
276
- object Failed {
277
- def from (t : Throwable ): Failed = {
278
- require(t ne null , " <null> throwable" )
279
-
280
- val msg = t.getMessage match {
281
- case null ⇒ " "
282
- case that ⇒ that
283
- }
284
- val trace = t.getStackTrace match {
285
- case null ⇒ Array [StackTraceElement ]()
286
- case that ⇒ that
287
- }
288
- new Failed (t.getClass.getName, msg, trace)
289
- }
290
281
}
0 commit comments