From 808259dccd650d41fad9c9adfdf5d936a0a7e292 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 2 Mar 2019 10:45:01 +0000 Subject: [PATCH] Introduce CancellableClosureTask before anyone picks a fight about the naming, take it up with shoghi... let's be consistently wrong at least --- .../scheduler/CancellableClosureTask.php | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/pocketmine/scheduler/CancellableClosureTask.php diff --git a/src/pocketmine/scheduler/CancellableClosureTask.php b/src/pocketmine/scheduler/CancellableClosureTask.php new file mode 100644 index 000000000..dbcd1f6e0 --- /dev/null +++ b/src/pocketmine/scheduler/CancellableClosureTask.php @@ -0,0 +1,73 @@ +scheduleTask(new CancellableClosureTask(function(int $currentTick) : bool{ + * echo "HI on $currentTick\n"; + * $continue = false; + * return $continue; //stop repeating + * }); + * ``` + * + * @see ClosureTask + */ +class CancellableClosureTask extends Task{ + public const CONTINUE = true; + public const CANCEL = false; + + /** @var \Closure */ + private $closure; + + /** + * CancellableClosureTask constructor. + * + * The closure should follow the signature callback(int $currentTick) : bool. The return value will be used to + * decide whether to continue repeating. + * + * @param \Closure $closure + */ + public function __construct(\Closure $closure){ + Utils::validateCallableSignature(function(int $currentTick) : bool{ return false; }, $closure); + $this->closure = $closure; + } + + public function getName() : string{ + return Utils::getNiceClosureName($this->closure); + } + + public function onRun(int $currentTick) : void{ + if(!($this->closure)($currentTick)){ + $this->getHandler()->cancel(); + } + } +}