-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathTracingFiberFactory.php
More file actions
64 lines (56 loc) · 1.37 KB
/
TracingFiberFactory.php
File metadata and controls
64 lines (56 loc) · 1.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
declare(strict_types=1);
namespace Revolt\EventLoop;
use Countable;
use IteratorAggregate;
use Traversable;
/**
* Fiber factory which collects all created fibers in a weak map.
*
* @implements IteratorAggregate<\Fiber, null>
*/
final class TracingFiberFactory implements FiberFactory, Countable, IteratorAggregate
{
/**
* @var \WeakMap<\Fiber, null>
*/
private readonly \WeakMap $map;
public function __construct(
private readonly FiberFactory $fiberFactory = new DefaultFiberFactory()
) {
/** @var \WeakMap<\Fiber, null> */
$this->map = new \WeakMap();
}
/**
* Creates a new fiber instance.
*
* @param callable $callable The callable to invoke when starting the fiber.
*
* @return \Fiber
*/
public function create(callable $callback): \Fiber
{
$f = $this->fiberFactory->create($callback);
/** @psalm-suppress InaccessibleProperty */
$this->map[$f] = null;
return $f;
}
/**
* Returns the number of running fibers.
*
* @return int
*/
public function count(): int
{
return $this->map->count();
}
/**
* Iterate over all fibers currently in scope.
*
* @return Traversable<\Fiber, null>
*/
public function getIterator(): Traversable
{
return $this->map->getIterator();
}
}