1
1
/*
2
- * Copyright 2011-2011 Christos KK Loverdos
2
+ * Copyright 2011-2012 Christos KK Loverdos
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -33,59 +33,81 @@ sealed abstract class Maybe[+A] {
33
33
def isNoVal : Boolean
34
34
def isFailed : Boolean
35
35
36
- def getOr [B >: A ](b : => B ): B
36
+ def getOr [B >: A ](b : ⇒ B ): B
37
37
38
- def || [B >: A ](f : => Maybe [B ]): Maybe [B ]
38
+ def || [B >: A ](f : ⇒ Maybe [B ]): Maybe [B ]
39
39
40
- def map [B ](f : A => B ): Maybe [B ]
40
+ def map [B ](f : A ⇒ B ): Maybe [B ]
41
41
42
- def flatMap [B ](f : A => Maybe [B ]): Maybe [B ]
42
+ def flatMap [B ](f : A ⇒ Maybe [B ]): Maybe [B ]
43
43
44
44
/**
45
45
* Map or return the provided default value.
46
46
*/
47
- def defMap [B ](default : => B )(f : A => B ): B = map(f) getOr default
47
+ def defMap [B ](default : ⇒ B )(f : A ⇒ B ): B = map(f) getOr default
48
48
49
49
/**
50
50
* Use this value of type `A` to provide another one of type `B` and then
51
51
* do some cleanup on the original value of type `A`.
52
52
*
53
53
* Use case: Get a DB cursor, perform calculations based on that and then close the cursor.
54
54
*/
55
- def finallyMap [B ](_finally : A => Unit )(f : A => B ): Maybe [B ]
55
+ def finallyMap [B ](_finally : A ⇒ Unit )(f : A ⇒ B ): Maybe [B ]
56
56
57
- def finallyFlatMap [B ](_finally : A => Unit )(f : A => Maybe [B ]): Maybe [B ]
57
+ def finallyFlatMap [B ](_finally : A ⇒ Unit )(f : A ⇒ Maybe [B ]): Maybe [B ]
58
58
59
59
@ inline
60
- final def >> [B ](f : A => Maybe [B ]): Maybe [B ] = this flatMap f
61
-
62
- def filter (f : A => Boolean ): Maybe [A ]
63
-
64
- def foreach (f : A => Unit ): Unit
65
-
66
- def fold [T ](onJust : (A ) => T )(onNoVal : => T )(onFailed : (Failed ) => T ): T
67
-
60
+ final def >> [B ](f : A ⇒ Maybe [B ]): Maybe [B ] = this flatMap f
61
+
62
+ def filter (f : A ⇒ Boolean ): Maybe [A ]
63
+
64
+ def foreach (f : A ⇒ Unit ): Unit
65
+
66
+ def fold [T ](onJust : (A ) ⇒ T )(onNoVal : ⇒ T )(onFailed : (Failed ) ⇒ T ): T
67
+
68
+ // @inline
69
+ // final def foldOption[B](onJust: (A) ⇒ B)(onNoVal: ⇒ B): Maybe[B] = this match {
70
+ // case Just(a) ⇒
71
+ // this.map(onJust)
72
+ // case NoVal ⇒
73
+ // Maybe(onNoVal)
74
+ // case failed @ Failed(_) ⇒
75
+ // failed
76
+ // }
77
+ //
78
+ // @inline
79
+ // def foldEither[B](onJust: (A) ⇒ B)(onFailed: ⇒ (Failed) => B): Maybe[B] = this match {
80
+ // case Just(a) ⇒
81
+ // this.map(onJust)
82
+ // case NoVal ⇒
83
+ // NoVal
84
+ // case failed @ Failed(_) ⇒
85
+ // Maybe(onFailed(failed))
86
+ // }
87
+
68
88
@ inline
69
- final def foldUnit (onJust : => Any )(onNoVal : => Any )(onFailed : => Any ): Unit =
70
- fold(a => onJust)(onNoVal)(f => onFailed)
89
+ final def foldUnit (onJust : ⇒ Any )(onNoVal : ⇒ Any )(onFailed : ⇒ Any ): Unit =
90
+ fold(a ⇒ onJust)(onNoVal)(f ⇒ onFailed)
71
91
72
92
@ inline
73
- final def foldJust [T ](onJust : (A ) => T )(onOther : => T ): T =
74
- fold(onJust)(onOther)(f => onOther)
93
+ final def foldJust [T ](onJust : (A ) ⇒ T )(onOther : ⇒ T ): T =
94
+ fold(onJust)(onOther)(f ⇒ onOther)
75
95
76
96
@ inline
77
- final def forJust [B >: A ](f : Just [A ] => Maybe [B ]): Maybe [B ] =
97
+ final def forJust [B >: A ](f : Just [A ] ⇒ Maybe [B ]): Maybe [B ] =
78
98
if (isJust) f(this .asInstanceOf [Just [A ]]) else this
79
99
80
100
@ inline
81
- final def forNoVal [B >: A ](f : => Maybe [B ]): Maybe [B ] =
101
+ final def forNoVal [B >: A ](f : ⇒ Maybe [B ]): Maybe [B ] =
82
102
if (isNoVal) f else this
83
103
84
104
@ inline
85
- final def forFailed [B >: A ](f : Failed => Maybe [B ]): Maybe [B ] =
105
+ final def forFailed [B >: A ](f : Failed ⇒ Maybe [B ]): Maybe [B ] =
86
106
if (isFailed) f(this .asInstanceOf [Failed ]) else this
87
107
88
- def castTo [B : Manifest ]: MaybeOption [B ]
108
+ def safeCastTo [B : Manifest ]: MaybeOption [B ]
109
+
110
+ def castTo [B : Manifest ]: Maybe [B ]
89
111
90
112
/**
91
113
* Flattens two successive maybes to one.
@@ -99,9 +121,9 @@ sealed abstract class Maybe[+A] {
99
121
sealed trait MaybeOption [+ A ] extends Maybe [A ]
100
122
101
123
object MaybeOption {
102
- def apply [A ](x : => A ): MaybeOption [A ] = Maybe (x) match {
103
- case j@ Just (_) => j
104
- case _ => NoVal
124
+ def apply [A ](x : ⇒ A ): MaybeOption [A ] = Maybe (x) match {
125
+ case j@ Just (_) ⇒ j
126
+ case _ ⇒ NoVal
105
127
}
106
128
}
107
129
@@ -111,12 +133,12 @@ object MaybeOption {
111
133
sealed trait MaybeEither [+ A ] extends Maybe [A ]
112
134
113
135
object MaybeEither {
114
- def apply [A ](x : => A ): MaybeEither [A ] = Maybe (x) match {
115
- case j@ Just (_) =>
136
+ def apply [A ](x : ⇒ A ): MaybeEither [A ] = Maybe (x) match {
137
+ case j@ Just (_) ⇒
116
138
j
117
- case f@ Failed (_) =>
139
+ case f@ Failed (_) ⇒
118
140
f
119
- case NoVal =>
141
+ case NoVal ⇒
120
142
Failed (new Exception (" Got NoVal for a MaybeFailed" ))
121
143
}
122
144
}
@@ -131,20 +153,20 @@ object Maybe {
131
153
* This is a polymorphic constructor for Maybes.
132
154
* Use it if you are not sure what to expect from `x`.
133
155
*/
134
- def apply [A ](x : => A ): Maybe [A ] = {
156
+ def apply [A ](x : ⇒ A ): Maybe [A ] = {
135
157
try {
136
158
val value = x
137
159
value match {
138
- case null => NoVal
139
- case _ => Just (value)
160
+ case null ⇒ NoVal
161
+ case _ ⇒ Just (value)
140
162
}
141
163
} catch {
142
- case e : Throwable => Failed (e)
164
+ case e : Throwable ⇒ Failed (e)
143
165
}
144
166
}
145
167
}
146
168
147
- final case class Just [@ specialized + A ](get : A ) extends MaybeOption [A ] with MaybeEither [A ] {
169
+ final case class Just [+ A ](get : A ) extends MaybeOption [A ] with MaybeEither [A ] {
148
170
def toIterator = Iterator (get)
149
171
def toTraversable = Traversable (get)
150
172
def toOption = Some (get)
@@ -154,31 +176,37 @@ final case class Just[@specialized +A](get: A) extends MaybeOption[A] with Maybe
154
176
def isFailed = false
155
177
def isNoVal = false
156
178
157
- def getOr [B >: A ](b : => B ) = get
179
+ def getOr [B >: A ](b : ⇒ B ) = get
158
180
159
181
160
- def finallyMap [B ](_finally : A => Unit )(f : A => B ): Maybe [B ] = {
182
+ def finallyMap [B ](_finally : A ⇒ Unit )(f : A ⇒ B ): Maybe [B ] = {
161
183
try this .map(f)
162
184
finally { safeUnit(_finally(get)) }
163
185
}
164
186
165
- def finallyFlatMap [B ](_finally : A => Unit )(f : A => Maybe [B ]): Maybe [B ] = {
187
+ def finallyFlatMap [B ](_finally : A ⇒ Unit )(f : A ⇒ Maybe [B ]): Maybe [B ] = {
166
188
try this .flatMap(f)
167
189
finally { safeUnit(_finally(get)) }
168
190
}
169
191
170
- def fold [T ](onJust : (A ) => T )(onOnVal : => T )(onFailed : (Failed ) => T ) = onJust(get)
192
+ def fold [T ](onJust : (A ) ⇒ T )(onOnVal : ⇒ T )(onFailed : (Failed ) ⇒ T ) = onJust(get)
193
+
194
+ def || [B >: A ](f : ⇒ Maybe [B ]) = this
171
195
172
- def || [B >: A ](f : => Maybe [B ]) = this
196
+ def map [B ](f : (A ) ⇒ B )= Maybe (f(get))
197
+ def flatMap [B ](f : (A ) ⇒ Maybe [B ]) = f(get)
198
+ def filter (f : (A ) ⇒ Boolean ): Maybe [A ] = if (f(get)) this else NoVal
199
+ def foreach (f : A ⇒ Unit ) = f(get)
173
200
174
- def map [ B ]( f : ( A ) => B ) = Maybe (f( get))
175
- def flatMap [ B ]( f : ( A ) => Maybe [ B ]) = f(get)
176
- def filter ( f : ( A ) => Boolean ) : Maybe [ A ] = if (f(get )) this else NoVal
177
- def foreach ( f : A => Unit ) = f(get)
201
+ def safeCastTo [ B : Manifest ] = get match {
202
+ case null ⇒ NoVal // normally null should not even be here but we are being cautious
203
+ case value ⇒ if (manifest[ B ].erasure.isInstance(value )) this . asInstanceOf [ MaybeOption [ B ]] else NoVal
204
+ }
178
205
179
206
def castTo [B : Manifest ] = get match {
180
- case null => NoVal // normally null should not even be here but we are being cautious
181
- case value => if (manifest[B ].erasure.isInstance(value)) this .asInstanceOf [MaybeOption [B ]] else NoVal
207
+ case null ⇒ NoVal
208
+ case value if (manifest[B ].erasure.isInstance(value)) ⇒ this .asInstanceOf [Maybe [B ]]
209
+ case value ⇒ Failed (new ClassCastException (" %s -> %s" .format(get.asInstanceOf [AnyRef ].getClass.getName, manifest[B ])))
182
210
}
183
211
184
212
def flatten1 [U ](implicit ev : A <:< Maybe [U ]): Maybe [U ] = ev(get)
@@ -197,22 +225,24 @@ case object NoVal extends MaybeOption[Nothing] {
197
225
def isNoVal = true
198
226
def isFailed = false
199
227
200
- def getOr [B >: Nothing ](b : => B ) = b
228
+ def getOr [B >: Nothing ](b : ⇒ B ) = b
201
229
202
- def fold [T ](onJust : (Nothing ) => T )(onNoVal : => T )(onFailed : (Failed )=> T ) = onNoVal
230
+ def fold [T ](onJust : (Nothing ) ⇒ T )(onNoVal : ⇒ T )(onFailed : (Failed )⇒ T ) = onNoVal
203
231
204
- def || [B >: Nothing ](f : => Maybe [B ]) = f
232
+ def || [B >: Nothing ](f : ⇒ Maybe [B ]) = f
205
233
206
- def map [B ](f : (Nothing ) => B )= NoVal
207
- def flatMap [B ](f : (Nothing ) => Maybe [B ]) = NoVal
208
- def filter (f : (Nothing ) => Boolean ) = NoVal
209
- def foreach (f : Nothing => Unit ) = {}
234
+ def map [B ](f : (Nothing ) ⇒ B )= NoVal
235
+ def flatMap [B ](f : (Nothing ) ⇒ Maybe [B ]) = NoVal
236
+ def filter (f : (Nothing ) ⇒ Boolean ) = NoVal
237
+ def foreach (f : Nothing ⇒ Unit ) = {}
210
238
211
- def finallyMap [B ](_finally : (Nothing ) => Unit )(f : (Nothing ) => B ) = this
239
+ def finallyMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ B ) = this
212
240
213
- def finallyFlatMap [B ](_finally : (Nothing ) => Unit )(f : (Nothing ) => Maybe [B ]) = this
241
+ def finallyFlatMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ Maybe [B ]) = this
214
242
215
- def castTo [B : Manifest ]: MaybeOption [B ] = NoVal
243
+ def safeCastTo [B : Manifest ]: MaybeOption [B ] = this
244
+
245
+ def castTo [B : Manifest ] = this
216
246
217
247
def flatten1 [U ](implicit ev : <:< [Nothing , Maybe [U ]]) = this
218
248
@@ -235,22 +265,24 @@ final case class Failed(cause: Throwable) extends MaybeEither[Nothing] {
235
265
def toList = Maybe .MaybeEmptyList
236
266
def toSet = Maybe .MaybeEmptySet
237
267
238
- def getOr [B >: Nothing ](b : => B ) = b
268
+ def getOr [B >: Nothing ](b : ⇒ B ) = b
269
+
270
+ def fold [T ](onJust : (Nothing ) ⇒ T )(onNoVal : ⇒ T )(onFailed : (Failed )⇒ T ) = onFailed(this )
239
271
240
- def fold [ T ]( onJust : ( Nothing ) => T )( onNoVal : => T )( onFailed : ( Failed ) => T ) = onFailed( this )
272
+ def || [ B >: Nothing ]( f : ⇒ Maybe [ B ] ) = f
241
273
242
- def || [B >: Nothing ](f : => Maybe [B ]) = f
274
+ def map [B ](f : (Nothing ) ⇒ B ) = this
275
+ def flatMap [B ](f : (Nothing ) ⇒ Maybe [B ]) = this
276
+ def filter (f : (Nothing ) ⇒ Boolean ) = this
277
+ def foreach (f : Nothing ⇒ Unit ) = {}
243
278
244
- def map [B ](f : (Nothing ) => B ) = this
245
- def flatMap [B ](f : (Nothing ) => Maybe [B ]) = this
246
- def filter (f : (Nothing ) => Boolean ) = this
247
- def foreach (f : Nothing => Unit ) = {}
279
+ def finallyMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ B ) = this
248
280
249
- def finallyMap [B ](_finally : (Nothing ) => Unit )(f : (Nothing ) => B ) = this
281
+ def finallyFlatMap [B ](_finally : (Nothing ) ⇒ Unit )(f : (Nothing ) ⇒ Maybe [ B ] ) = this
250
282
251
- def finallyFlatMap [ B ]( _finally : ( Nothing ) => Unit )( f : ( Nothing ) => Maybe [B ]) = this
283
+ def safeCastTo [ B : Manifest ] : MaybeOption [B ] = NoVal
252
284
253
- def castTo [B : Manifest ]: MaybeOption [ B ] = NoVal
285
+ def castTo [B : Manifest ] = this
254
286
255
287
def flatten1 [U ](implicit ev : <:< [Nothing , Maybe [U ]]) = this
256
288
0 commit comments