@@ -19,7 +19,7 @@ package com.ckkloverdos.maybe
19
19
import collection .Iterator
20
20
21
21
/**
22
- * Inspired by Lift's `Box`, Haskell's `Maybe` and Scala's ` Option` .
22
+ * Inspired by Lift's `Box`, Haskell's `Maybe` and Scala's [[ scala. Option]] .
23
23
*
24
24
* @author Christos KK Loverdos <loverdos@gmail.com>
25
25
*/
@@ -29,6 +29,8 @@ sealed abstract class Maybe[+A] extends Serializable {
29
29
def toOption : Option [A ]
30
30
def toList : List [A ]
31
31
def toStream : Stream [A ]
32
+ def toMaybeOption : MaybeOption [A ]
33
+ def toMaybeEither : MaybeEither [A ]
32
34
33
35
def isJust : Boolean
34
36
def isNoVal : Boolean
@@ -42,27 +44,21 @@ sealed abstract class Maybe[+A] extends Serializable {
42
44
43
45
def flatMap [B ](f : A ⇒ Maybe [B ]): Maybe [B ]
44
46
45
- def mapJust [B >: A ](f : Just [A ] ⇒ Maybe [B ]): Maybe [B ]
46
-
47
- def mapNoVal [B >: A ](f : ⇒ Maybe [B ]): Maybe [B ]
48
-
49
- def mapFailed [B >: A ](f : Failed ⇒ Maybe [B ]): Maybe [B ]
50
-
51
47
/**
52
48
* Map or return the provided default value.
53
49
*/
54
50
@ inline
55
- def defaultMap [B ](default : ⇒ B )(f : A ⇒ B ): B = map(f) getOr default
51
+ def mapDefault [B ](default : ⇒ B )(f : A ⇒ B ): B = map(f) getOr default
56
52
57
53
/**
58
54
* Use this value of type `A` to provide another one of type `B` and then
59
55
* do some cleanup on the original value of type `A`.
60
56
*
61
57
* Use case: Get a DB cursor, perform calculations based on that and then close the cursor.
62
58
*/
63
- def finallyMap [B ](_finally : A ⇒ Unit )(f : A ⇒ B ): Maybe [B ]
59
+ def mapFinally [B ](_finally : A ⇒ Unit )(f : A ⇒ B ): Maybe [B ]
64
60
65
- def finallyFlatMap [B ](_finally : A ⇒ Unit )(f : A ⇒ Maybe [B ]): Maybe [B ]
61
+ def flatMapFinally [B ](_finally : A ⇒ Unit )(f : A ⇒ Maybe [B ]): Maybe [B ]
66
62
67
63
@ inline
68
64
final def >> [B ](f : A ⇒ Maybe [B ]): Maybe [B ] = this flatMap f
@@ -89,7 +85,7 @@ sealed abstract class Maybe[+A] extends Serializable {
89
85
/**
90
86
* If this is a [[com.ckkloverdos.maybe.Failed ]], throw its exception. Otherwise do nothing.
91
87
*/
92
- def throwMe : Unit
88
+ def throwMe () : Unit
93
89
}
94
90
95
91
/**
@@ -131,6 +127,8 @@ object Maybe {
131
127
/**
132
128
* This is a polymorphic constructor for Maybes.
133
129
* Use it if you are not sure what to expect from `x`.
130
+ *
131
+ * All exceptions but [[java.lang.Error ]]s are caught.
134
132
*/
135
133
def apply [A ](x : ⇒ A ): Maybe [A ] = {
136
134
try {
@@ -155,6 +153,8 @@ final case class Just[+A](get: A) extends MaybeOption[A] with MaybeEither[A] {
155
153
def toOption = Some (get)
156
154
def toList = List (get)
157
155
def toStream = Stream .cons(get, Stream .Empty )
156
+ def toMaybeOption = this
157
+ def toMaybeEither = this
158
158
159
159
def toEither : Either [Throwable , A ] = Right (get)
160
160
@@ -164,27 +164,12 @@ final case class Just[+A](get: A) extends MaybeOption[A] with MaybeEither[A] {
164
164
165
165
def getOr [B >: A ](b : ⇒ B ) = get
166
166
167
- def mapJust [B >: A ](f : (Just [A ]) => Maybe [B ]) = {
168
- try f(this )
169
- catch {
170
- case e : Error ⇒
171
- throw e
172
-
173
- case e : Throwable ⇒
174
- Failed (e)
175
- }
176
- }
177
-
178
- def mapNoVal [B >: A ](f : => Maybe [B ]) = this
179
-
180
- def mapFailed [B >: A ](f : (Failed ) => Maybe [B ]) = this
181
-
182
- def finallyMap [B ](_finally : A ⇒ Unit )(f : A ⇒ B ): Maybe [B ] = {
167
+ def mapFinally [B ](_finally : A ⇒ Unit )(f : A ⇒ B ): Maybe [B ] = {
183
168
try this .map(f)
184
169
finally { safeUnit(_finally(get)) }
185
170
}
186
171
187
- def finallyFlatMap [B ](_finally : A ⇒ Unit )(f : A ⇒ Maybe [B ]): Maybe [B ] = {
172
+ def flatMapFinally [B ](_finally : A ⇒ Unit )(f : A ⇒ Maybe [B ]): Maybe [B ] = {
188
173
try this .flatMap(f)
189
174
finally { safeUnit(_finally(get)) }
190
175
}
@@ -221,7 +206,7 @@ final case class Just[+A](get: A) extends MaybeOption[A] with MaybeEither[A] {
221
206
222
207
def flatten1 [U ](implicit ev : A <:< Maybe [U ]): Maybe [U ] = ev(get)
223
208
224
- def throwMe = {}
209
+ def throwMe () = {}
225
210
226
211
override def equals (that : Any ) =
227
212
that.isInstanceOf [Just [_]] && that.asInstanceOf [Just [_]].get == this .get
@@ -233,19 +218,15 @@ case object NoVal extends MaybeOption[Nothing] {
233
218
def toOption = None
234
219
def toList = Maybe .MaybeEmptyList
235
220
def toStream = Stream .Empty
221
+ def toMaybeOption = this
222
+ def toMaybeEither = Failed (new Exception (" No value" ))
236
223
237
224
def isJust = false
238
225
def isNoVal = true
239
226
def isFailed = false
240
227
241
228
def getOr [B >: Nothing ](b : ⇒ B ) = b
242
229
243
- def mapJust [B >: Nothing ](f : (Just [Nothing ]) => Maybe [B ]) = this
244
-
245
- def mapNoVal [B >: Nothing ](f : => Maybe [B ]) = f
246
-
247
- def mapFailed [B >: Nothing ](f : (Failed ) => Maybe [B ]) = this
248
-
249
230
def fold [T ](onJust : (Nothing ) ⇒ T )(onNoVal : ⇒ T )(onFailed : (Failed )⇒ T ) = onNoVal
250
231
251
232
def || [B >: Nothing ](f : ⇒ Maybe [B ]) = f
@@ -255,13 +236,13 @@ case object NoVal extends MaybeOption[Nothing] {
255
236
def filter (f : (Nothing ) ⇒ Boolean ) = NoVal
256
237
def foreach [U ](f : Nothing ⇒ U ) = {}
257
238
258
- def finallyMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ B ) = this
239
+ def mapFinally [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ B ) = this
259
240
260
- def finallyFlatMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ Maybe [B ]) = this
241
+ def flatMapFinally [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ Maybe [B ]) = this
261
242
262
243
def flatten1 [U ](implicit ev : <:< [Nothing , Maybe [U ]]) = this
263
244
264
- def throwMe = {}
245
+ def throwMe () = {}
265
246
266
247
override def equals (that : Any ) = that.asInstanceOf [AnyRef ] eq NoVal
267
248
}
@@ -281,26 +262,13 @@ final case class Failed(exception: Throwable) extends MaybeEither[Nothing] {
281
262
def toOption = None
282
263
def toList = Maybe .MaybeEmptyList
283
264
def toStream = Stream .Empty
265
+ def toMaybeOption = NoVal
266
+ def toMaybeEither = this
284
267
285
268
def toEither : Either [Throwable , Nothing ] = Left (exception)
286
269
287
270
def getOr [B >: Nothing ](b : ⇒ B ) = b
288
271
289
- def mapJust [B >: Nothing ](f : (Just [Nothing ]) => Maybe [B ]) = this
290
-
291
- def mapNoVal [B >: Nothing ](f : => Maybe [B ]) = this
292
-
293
- def mapFailed [B >: Nothing ](f : (Failed ) => Maybe [B ]) = {
294
- try f(this )
295
- catch {
296
- case e : Error ⇒
297
- throw e
298
-
299
- case e : Throwable ⇒
300
- Failed (e)
301
- }
302
- }
303
-
304
272
def fold [T ](onJust : (Nothing ) ⇒ T )(onNoVal : ⇒ T )(onFailed : (Failed )⇒ T ) = onFailed(this )
305
273
306
274
def || [B >: Nothing ](f : ⇒ Maybe [B ]) = f
@@ -310,13 +278,13 @@ final case class Failed(exception: Throwable) extends MaybeEither[Nothing] {
310
278
def filter (f : (Nothing ) ⇒ Boolean ) = this
311
279
def foreach [U ](f : Nothing ⇒ U ) = {}
312
280
313
- def finallyMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ B ) = this
281
+ def mapFinally [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ B ) = this
314
282
315
- def finallyFlatMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ Maybe [B ]) = this
283
+ def flatMapFinally [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ Maybe [B ]) = this
316
284
317
285
def flatten1 [U ](implicit ev : <:< [Nothing , Maybe [U ]]) = this
318
286
319
- def throwMe = throw exception
287
+ def throwMe () = throw exception
320
288
321
289
override def equals (that : Any ) = {
322
290
that match {
0 commit comments