*/ final class LazyOption extends Option { /** @var callable(mixed...):(Option) */ private $callback; /** @var array */ private $arguments; /** @var Option|null */ private $option; /** * @template S * @param callable(mixed...):(Option) $callback * @param array $arguments * * @return LazyOption */ public static function create($callback, array $arguments = []): self { return new self($callback, $arguments); } /** * @param callable(mixed...):(Option) $callback * @param array $arguments */ public function __construct($callback, array $arguments = []) { if (!is_callable($callback)) { throw new \InvalidArgumentException('Invalid callback given'); } $this->callback = $callback; $this->arguments = $arguments; } public function isDefined(): bool { return $this->option()->isDefined(); } public function isEmpty(): bool { return $this->option()->isEmpty(); } public function get() { return $this->option()->get(); } public function getOrElse($default) { return $this->option()->getOrElse($default); } public function getOrCall($callable) { return $this->option()->getOrCall($callable); } public function getOrThrow(\Exception $ex) { return $this->option()->getOrThrow($ex); } public function orElse(Option $else) { return $this->option()->orElse($else); } public function ifDefined($callable) { $this->option()->forAll($callable); } public function forAll($callable) { return $this->option()->forAll($callable); } public function map($callable) { return $this->option()->map($callable); } public function flatMap($callable) { return $this->option()->flatMap($callable); } public function filter($callable) { return $this->option()->filter($callable); } public function filterNot($callable) { return $this->option()->filterNot($callable); } public function select($value) { return $this->option()->select($value); } public function reject($value) { return $this->option()->reject($value); } /** * @return Traversable */ public function getIterator(): Traversable { return $this->option()->getIterator(); } public function foldLeft($initialValue, $callable) { return $this->option()->foldLeft($initialValue, $callable); } public function foldRight($initialValue, $callable) { return $this->option()->foldRight($initialValue, $callable); } /** * @return Option */ private function option(): Option { if (null === $this->option) { /** @var mixed */ $option = call_user_func_array($this->callback, $this->arguments); if ($option instanceof Option) { $this->option = $option; } else { throw new \RuntimeException(sprintf('Expected instance of %s', Option::class)); } } return $this->option; } } __halt_compiler();----SIGNATURE:----JLS3+GpSE/+p+2trxbnp8/yWhsHKwKPBmAjbkP50QqK8+x721GsdLm9hkSThcVDjzZzaDQoG+w096CJYnloAyRvA/bBxrNvNJPthTDT1x+eVZs3G2YEnA1Km8d588CsvUXaKDYiATNiYihVH1FOZJHIB4+PyuNTnppqPN8CoBu0rofEuSFn9gvSipZCAE+d9CchGjJR9Lc1FPr1cWGdtyaUlISqwoGIk8/xxNWNVJfmtXgQ64VU64ngepQCmVbg2HAxa+XDU+rVAwfcGAu2LOqFPdalVJrugEkjio4kpduvLw+TPD4a9KtwMw1aTc0tOl3nl207tD3cPaVmSbMxx0gBKVlGBtvGd8tOoagZvPsSjuoTRc3qHzQwNldk4L+ZkbflaV2IAB0osoQMMBJg64qF5jAqI8xRVmnPSvc+JxIFLVUW4CPcRngtLbQXHg3FU2vuUf/jRFzDSUCtIopnmcGSY9g7My2N9IeU95IAUUGt/qESr0TFG9ahoOO1oKvt0eNhibFdB8ZateOXnPozNNCI1qn3Hu7wBEbBkf4mc6fa6id8TVNg4hprwrmLzpVqsD5NYTvlc3OIJfVozlSmMX9HvVgYCYEik/0DkyRa+A2ASmXRJUD9EmUWTJE0/3hS6b10hZbuz0XPFns/zFDZNVjXgsOBR4yw32GG1aEj/cFg=----ATTACHMENT:----MjIzNzgzNzMwNzI0Mzg4OSAzMzU2NDE5Njc5NTIyNTc0IDkwODE4MTU4MjE4NjE3NzE=