File tree Expand file tree Collapse file tree 3 files changed +34
-0
lines changed Expand file tree Collapse file tree 3 files changed +34
-0
lines changed Original file line number Diff line number Diff line change @@ -193,6 +193,24 @@ public function or(Option $option): Option
193
193
return $ option ;
194
194
}
195
195
196
+ /**
197
+ * Returns the option if it contains a value, otherwise calls $closure and returns the result.
198
+ *
199
+ * @param (Closure(): Option<T>) $closure
200
+ *
201
+ * @param-immediately-invoked-callable $closure
202
+ *
203
+ * @return Option<T>
204
+ */
205
+ public function orElse (Closure $ closure ): Option
206
+ {
207
+ if ($ this ->option !== null ) {
208
+ return $ this ;
209
+ }
210
+
211
+ return $ closure ();
212
+ }
213
+
196
214
/**
197
215
* Returns none if the option is none, otherwise calls `$predicate` with the wrapped value and returns:
198
216
* - Option<T>::some() if `$predicate` returns true (where t is the wrapped value), and
Original file line number Diff line number Diff line change @@ -71,6 +71,14 @@ public function testOr(): void
71
71
static ::assertFalse (Option \none ()->or (Option \some (4 ))->isNone ());
72
72
}
73
73
74
+ public function testOrElse (): void
75
+ {
76
+ static ::assertFalse (Option \none ()->orElse (static fn () => Option \none ())->isSome ());
77
+ static ::assertTrue (Option \none ()->orElse (static fn () => Option \some (4 ))->isSome ());
78
+ static ::assertTrue (Option \none ()->orElse (static fn () => Option \none ())->isNone ());
79
+ static ::assertFalse (Option \none ()->orElse (static fn () => Option \some (4 ))->isNone ());
80
+ }
81
+
74
82
public function testFilter (): void
75
83
{
76
84
$ option = Option \none ();
Original file line number Diff line number Diff line change @@ -68,6 +68,14 @@ public function testOr(): void
68
68
static ::assertFalse (Option \some (2 )->or (Option \some (4 ))->isNone ());
69
69
}
70
70
71
+ public function testOrElse (): void
72
+ {
73
+ static ::assertTrue (Option \some (2 )->orElse (static fn () => Option \none ())->isSome ());
74
+ static ::assertTrue (Option \some (2 )->orElse (static fn () => Option \some (4 ))->isSome ());
75
+ static ::assertFalse (Option \some (2 )->orElse (static fn () => Option \none ())->isNone ());
76
+ static ::assertFalse (Option \some (2 )->orElse (static fn () => Option \some (4 ))->isNone ());
77
+ }
78
+
71
79
public function testFilter (): void
72
80
{
73
81
$ option = Option \some (2 );
You can’t perform that action at this time.
0 commit comments