/** * maybe :: b -> (a -> b) -> Maybe a -> b * * @param null $default * @param callable $fn * @param Maybe $maybe * * @return mixed|\Closure */ function maybe($default, callable $fn = null, Maybe $maybe = null) { return call_user_func_array(f\curryN(3, function ($default, callable $fn, Maybe $maybe) { if ($maybe instanceof Nothing) { return $default; } return call_user_func($fn, $maybe->extract()); }), func_get_args()); }