@@ -73,7 +73,7 @@ sealed abstract class Maybe[+A] extends Equals {
73
73
74
74
def canEqual (that : Any ): Boolean = that match {
75
75
case _ : Maybe [_] => true
76
- case _ => false
76
+ case _ => false
77
77
}
78
78
79
79
override def equals (that : Any ) = that match {
@@ -84,8 +84,24 @@ sealed abstract class Maybe[+A] extends Equals {
84
84
protected def equalsImpl (that : Maybe [_]): Boolean
85
85
}
86
86
87
+ /**
88
+ * A Maybe that can be either a Just or a NoVal. So, this is like Scala's Option
89
+ */
90
+ sealed abstract class MaybeOption [+ A ] extends Maybe [A ] {
91
+ override def canEqual (that : Any ): Boolean = that match {
92
+ case _ : MaybeOption [_] => true
93
+ case _ => false
94
+ }
95
+ }
96
+
97
+ object MaybeOption {
98
+ def apply [A ](x : => A ): MaybeOption [A ] = Maybe (x) match {
99
+ case j@ Just (_) => j
100
+ case _ => NoVal
101
+ }
102
+ }
103
+
87
104
object Maybe {
88
- type AnyFailure = Failed
89
105
val MaybeEmptyIterator : Iterator [Nothing ] = Iterator ()
90
106
val MaybeEmptyTraversable : Traversable [Nothing ] = Traversable ()
91
107
val MaybeEmptyList : List [Nothing ] = List ()
@@ -100,20 +116,20 @@ object Maybe {
100
116
* This is a polymorphic constructor for Maybes.
101
117
* Use it if you are not sure what to expect from `x`.
102
118
*/
103
- def apply [A ](x : => A ) = {
119
+ def apply [A ](x : => A ): Maybe [ A ] = {
104
120
try {
105
121
val value = x
106
122
value match {
107
123
case null => NoVal
108
124
case _ => Just (value)
109
125
}
110
126
} catch {
111
- case e : Throwable => Failed (e, " Maybe() failed " )
127
+ case e : Throwable => Failed (e, " Maybe.apply() " )
112
128
}
113
129
}
114
130
}
115
131
116
- final case class Just [@ specialized(Boolean , Char , Int , Double ) + A ](get : A ) extends Maybe [A ] {
132
+ final case class Just [@ specialized(Boolean , Char , Int , Double ) + A ](get : A ) extends MaybeOption [A ] {
117
133
def toIterator = Iterator (get)
118
134
def toTraversable = Traversable (get)
119
135
def toOption = Some (get)
@@ -140,7 +156,7 @@ final case class Just[@specialized(Boolean, Char, Int, Double) +A](get: A) exten
140
156
}
141
157
}
142
158
143
- case object NoVal extends Maybe [Nothing ] {
159
+ case object NoVal extends MaybeOption [Nothing ] {
144
160
def toIterator = Maybe .MaybeEmptyIterator
145
161
def toTraversable = Maybe .MaybeEmptyTraversable
146
162
def toOption = None
0 commit comments