The MayBe monad, Groovy style
class MayBe<Subject> {
final Subject val
MayBe(Subject val){ this.val = val }
MayBe bind ( MayBe arg, Closure combine ) {
if (arg.val == null) return arg
if (val == null) return this
return new MayBe(combine(val, arg.val))
}
}
def (one, two, three, nil) = [1,2,3,null].collect{ new MayBe(it) }
assert 9 == one
.bind(two) {a,b -> a + b}
.bind(three) {a,b -> a * b}
.val
assert null == one
.bind(two) {a,b -> a + b}
.bind(nil) {a,b -> throw RuntimeException("should not execute")}
.bind(three) {a,b -> a * b}
.val
println "done"