Skip to content
This repository was archived by the owner on Aug 17, 2019. It is now read-only.

Commit 53674ba

Browse files
committed
Remove the family code (for now) and refactor the folds
1 parent a6d0ee0 commit 53674ba

File tree

4 files changed

+36
-281
lines changed

4 files changed

+36
-281
lines changed

Diff for: src/main/scala/com/ckkloverdos/maybe/Maybe.scala

+27-34
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,15 @@ sealed abstract class Maybe[+A] extends Equals {
4949

5050
def foreach(f: A => Unit): Unit
5151

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)
5361

5462
@inline
5563
final def forJust[B >: A](f: Just[A] => Maybe[B]): Maybe[B] =
@@ -60,8 +68,8 @@ sealed abstract class Maybe[+A] extends Equals {
6068
if(isNoVal) f else this
6169

6270
@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
6573

6674
def canEqual(that: Any): Boolean = that match {
6775
case _: Maybe[_] => true
@@ -77,7 +85,7 @@ sealed abstract class Maybe[+A] extends Equals {
7785
}
7886

7987
object Maybe {
80-
type AnyFailure = Failed[_]
88+
type AnyFailure = Failed
8189
val MaybeEmptyIterator : Iterator [Nothing] = Iterator ()
8290
val MaybeEmptyTraversable: Traversable[Nothing] = Traversable()
8391
val MaybeEmptyList : List [Nothing] = List ()
@@ -100,20 +108,11 @@ object Maybe {
100108
case _ => Just(value)
101109
}
102110
} catch {
103-
case e: Throwable => Failed(Some("Maybe() failed"), Just(e), NoVal, NoVal)
111+
case e: Throwable => Failed(e, "Maybe() failed")
104112
}
105113
}
106114
}
107115

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-
117116
final case class Just[@specialized(Boolean, Char, Int, Double) +A](get: A) extends Maybe[A] {
118117
def toIterator = Iterator(get)
119118
def toTraversable = Traversable(get)
@@ -126,8 +125,7 @@ final case class Just[@specialized(Boolean, Char, Int, Double) +A](get: A) exten
126125

127126
def getOr[B >: A](b: => B) = get
128127

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)
131129

132130
def ||[B >: A](f: => Maybe[B]) = this
133131

@@ -138,7 +136,7 @@ final case class Just[@specialized(Boolean, Char, Int, Double) +A](get: A) exten
138136

139137
protected def equalsImpl(that: Maybe[_]) = that match {
140138
case Just(v) => v == get
141-
case _ => false
139+
case _ => false
142140
}
143141
}
144142

@@ -154,8 +152,7 @@ case object NoVal extends Maybe[Nothing] {
154152

155153
def getOr[B >: Nothing](b: => B) = b
156154

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
159156

160157
def ||[B >: Nothing](f: => Maybe[B]) = f
161158

@@ -170,14 +167,10 @@ case object NoVal extends Maybe[Nothing] {
170167
}
171168
}
172169

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] {
181174

182175
def isJust = false
183176
def isNoVal = false
@@ -191,8 +184,7 @@ final case class Failed[T: Manifest](
191184

192185
def getOr[B >: Nothing](b: => B) = b
193186

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)
196188

197189
def ||[B >: Nothing](f: => Maybe[B]) = f
198190

@@ -202,12 +194,13 @@ final case class Failed[T: Manifest](
202194
def foreach(f: Nothing => Unit) = {}
203195

204196
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
210198
case _ => false
211199
}
212200
}
213201

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+
}

Diff for: src/main/scala/com/ckkloverdos/maybe/family/MaybeFamily.scala

-239
This file was deleted.

Diff for: src/main/scala/com/ckkloverdos/package.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@ package object maybe {
3232
} catch {
3333
case e: Throwable =>
3434
ignoreExceptions (_catch)
35-
Failed(NoVal, Just(e), NoVal, NoVal)
35+
Failed(e)
3636
} finally {
3737
ignoreExceptions(_finally)
3838
}
3939
}
4040

41+
@inline
4142
def safe[A](f: => A): Maybe[A] = Maybe(f)
4243
}

0 commit comments

Comments
 (0)