*/ function timeout($seconds = 0): Promise { $promise = new Promise; Loop\setTimeout([$promise, 'fulfill'], $seconds); return $promise; } /** * Returns a promise that is fulfilled once the passed event was triggered on the passed EventEmitter * * @param EmitterInterface $emitter * @param string $event * @return Promise */ function waitForEvent(EmitterInterface $emitter, string $event): Promise { $p = new Promise; $emitter->once($event, [$p, 'fulfill']); return $p; } /** * Returns the closest node of a specific type * * @param Node $node * @param string $type The node class name * @return Node|null $type */ function getClosestNode(Node $node, string $type) { $n = $node; while ($n = $n->getAttribute('parentNode')) { if ($n instanceof $type) { return $n; } } } /** * Returns the part of $b that is not overlapped by $a * Example: * * stripStringOverlap('whatever