Skip to content

Commit

Permalink
support callable
Browse files Browse the repository at this point in the history
  • Loading branch information
thgs committed Oct 31, 2021
1 parent ab58122 commit 0c95532
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 84 deletions.
52 changes: 26 additions & 26 deletions src/Option.php
@@ -1,4 +1,5 @@
<?php

/**
* Option
*
Expand All @@ -10,7 +11,6 @@

namespace Prewk;

use Closure;
use Exception;
use Prewk\Option\{OptionException, Some, None};
use Traversable;
Expand Down Expand Up @@ -70,26 +70,26 @@ abstract public function unwrap();
abstract public function unwrapOr($optb);

/**
* Returns the contained value or computes it from a closure.
* Returns the contained value or computes it from a callable.
*
* @param Closure $op
* @psalm-param Closure(mixed...):T $op
* @param callable $op
* @psalm-param callable(mixed...):T $op
* @return mixed
* @psalm-return T
*/
abstract public function unwrapOrElse(Closure $op);
abstract public function unwrapOrElse(callable $op);

/**
* Maps an Option by applying a function to a contained Some value, leaving a None value untouched.
*
* @template U
*
* @param Closure $mapper
* @psalm-param Closure(T=,mixed...):U $mapper
* @param callable $mapper
* @psalm-param callable(T=,mixed...):U $mapper
* @return Option
* @psalm-return Option<U>
*/
abstract public function map(Closure $mapper): Option;
abstract public function map(callable $mapper): Option;

/**
* Applies a function to the contained value (if any), or returns a default (if not).
Expand All @@ -98,26 +98,26 @@ abstract public function map(Closure $mapper): Option;
*
* @param mixed $default
* @psalm-param U $default
* @param Closure $mapper
* @psalm-param Closure(T=,mixed...):U $mapper
* @param callable $mapper
* @psalm-param callable(T=,mixed...):U $mapper
* @return mixed
* @psalm-return U
*/
abstract public function mapOr($default, Closure $mapper);
abstract public function mapOr($default, callable $mapper);

/**
* Applies a function to the contained value (if any), or computes a default (if not).
*
* @template U
*
* @param Closure $default
* @psalm-param Closure(mixed...):U $default
* @param Closure $mapper
* @psalm-param Closure(T=,mixed...):U $mapper
* @param callable $default
* @psalm-param callable(mixed...):U $default
* @param callable $mapper
* @psalm-param callable(T=,mixed...):U $mapper
* @return mixed
* @psalm-return U
*/
abstract public function mapOrElse(Closure $default, Closure $mapper);
abstract public function mapOrElse(callable $default, callable $mapper);

/**
* Transforms the Option<T> into a Result<T, E>, mapping Some(v) to Ok(v) and None to Err(err).
Expand All @@ -136,12 +136,12 @@ abstract public function okOr($err): Result;
*
* @template E
*
* @param Closure $err
* @psalm-param Closure(mixed...):E $err
* @param callable $err
* @psalm-param callable(mixed...):E $err
* @return Result
* @psalm-return Result<T, E>
*/
abstract public function okOrElse(Closure $err): Result;
abstract public function okOrElse(callable $err): Result;

/**
* Returns an iterator over the possibly contained value.
Expand Down Expand Up @@ -170,12 +170,12 @@ abstract public function and(Option $optb): Option;
*
* @template U
*
* @param Closure $op
* @psalm-param Closure(T=,mixed...):Option<U> $op
* @param callable $op
* @psalm-param callable(T=,mixed...):Option<U> $op
* @return Option
* @psalm-return Option<U>
*/
abstract public function andThen(Closure $op): Option;
abstract public function andThen(callable $op): Option;

/**
* Returns the option if it contains a value, otherwise returns optb.
Expand All @@ -190,15 +190,15 @@ abstract public function or(Option $optb): Option;
/**
* Returns the option if it contains a value, otherwise calls op and returns the result.
*
* @param Closure $op
* @psalm-param Closure(mixed...):Option<T> $op
* @param callable $op
* @psalm-param callable(mixed...):Option<T> $op
* @return Option
* @psalm-return Option<T>
*/
abstract public function orElse(Closure $op): Option;
abstract public function orElse(callable $op): Option;

/**
* The attached pass-through args will be unpacked into extra args into chained closures
* The attached pass-through args will be unpacked into extra args into chained callables
*
* @param mixed ...$args
* @return Option
Expand Down
59 changes: 30 additions & 29 deletions src/Option/None.php
@@ -1,4 +1,5 @@
<?php

/**
* None
*
Expand All @@ -10,7 +11,6 @@

namespace Prewk\Option;

use Closure;
use Exception;
use Prewk\Option;
use Prewk\Result;
Expand All @@ -37,7 +37,8 @@ class None extends Option
*
* @param mixed ...$pass
*/
public function __construct(...$pass) {
public function __construct(...$pass)
{
$this->pass = $pass;
}

Expand Down Expand Up @@ -100,14 +101,14 @@ public function unwrapOr($optb)
}

/**
* Returns the contained value or computes it from a closure.
* Returns the contained value or computes it from a callable.
*
* @param Closure $op
* @psalm-param Closure(mixed...):T $op
* @param callable $op
* @psalm-param callable(mixed...):T $op
* @return mixed
* @psalm-return T
*/
public function unwrapOrElse(Closure $op)
public function unwrapOrElse(callable $op)
{
return $op(...$this->pass);
}
Expand All @@ -117,12 +118,12 @@ public function unwrapOrElse(Closure $op)
*
* @template U
*
* @param Closure $mapper
* @psalm-param Closure(T=,mixed...):U $mapper
* @param callable $mapper
* @psalm-param callable(T=,mixed...):U $mapper
* @return Option
* @psalm-return Option<U>
*/
public function map(Closure $mapper): Option
public function map(callable $mapper): Option
{
return new self(...$this->pass);
}
Expand All @@ -134,12 +135,12 @@ public function map(Closure $mapper): Option
*
* @param mixed $default
* @psalm-param U $default
* @param Closure $mapper
* @psalm-param Closure(T=,mixed...):U $mapper
* @param callable $mapper
* @psalm-param callable(T=,mixed...):U $mapper
* @return mixed
* @psalm-return U
*/
public function mapOr($default, Closure $mapper)
public function mapOr($default, callable $mapper)
{
return $default;
}
Expand All @@ -149,14 +150,14 @@ public function mapOr($default, Closure $mapper)
*
* @template U
*
* @param Closure $default
* @psalm-param Closure(mixed...):U $default
* @param Closure $mapper
* @psalm-param Closure(T=,mixed...):U $mapper
* @param callable $default
* @psalm-param callable(mixed...):U $default
* @param callable $mapper
* @psalm-param callable(T=,mixed...):U $mapper
* @return mixed
* @psalm-return U
*/
public function mapOrElse(Closure $default, Closure $mapper)
public function mapOrElse(callable $default, callable $mapper)
{
return $default(...$this->pass);
}
Expand Down Expand Up @@ -194,12 +195,12 @@ public function and(Option $optb): Option
*
* @template U
*
* @param Closure $op
* @psalm-param Closure(T=,mixed...):Option<U> $op
* @param callable $op
* @psalm-param callable(T=,mixed...):Option<U> $op
* @return Option
* @psalm-return Option<U>
*/
public function andThen(Closure $op): Option
public function andThen(callable $op): Option
{
return new self(...$this->pass);
}
Expand All @@ -220,17 +221,17 @@ public function or(Option $optb): Option
/**
* Returns the option if it contains a value, otherwise calls op and returns the result.
*
* @param Closure $op
* @psalm-param Closure(mixed...):Option<T> $op
* @param callable $op
* @psalm-param callable(mixed...):Option<T> $op
* @return Option
* @psalm-return Option<T>
*
* @throws OptionException on closure return type mismatch
* @psalm-assert !Closure():Option $op
* @throws OptionException on callable return type mismatch
* @psalm-assert !callable():Option $op
*
* @psalm-suppress DocblockTypeContradiction We cannot be completely sure, that in argument valid callable
*/
public function orElse(Closure $op): Option
public function orElse(callable $op): Option
{
$option = $op(...$this->pass);

Expand Down Expand Up @@ -261,18 +262,18 @@ public function okOr($err): Result
*
* @template E
*
* @param Closure $err
* @psalm-param Closure(mixed...):E $err
* @param callable $err
* @psalm-param callable(mixed...):E $err
* @return Result
* @psalm-return Result<T, E>
*/
public function okOrElse(Closure $err): Result
public function okOrElse(callable $err): Result
{
return new Err($err(...$this->pass), ...$this->pass);
}

/**
* The attached pass-through args will be unpacked into extra args into chained closures
* The attached pass-through args will be unpacked into extra args into chained callables
*
* @param mixed ...$args
* @return Option
Expand Down

0 comments on commit 0c95532

Please sign in to comment.