77use Boson \Component \WeakType \Internal \ReferenceReleaseCallback ;
88
99/**
10- * Allows to store a set of objects with referenced values and
11- * track their destruction (react to GC cleanup) .
10+ * When adding an object using {@see ObservableWeakMap::watch()} method,
11+ * this implementation does not increase its refcount .
1212 *
13- * ```
14- * // ObservableWeakMap<ExampleId, CData>
15- * $map = new ObservableWeakMap();
16- *
17- * $map->watch($id, $data, function (CData $ref) {
18- * echo vsprintf('ID has been destroyed, something can be done with its reference %s(%d)', [
19- * $ref::class,
20- * get_object_id($ref),
21- * ]);
22- * ));
23- * ```
24- *
25- * @api
26- *
27- * @template TKey of object = object
13+ * @template TObservable of object = object
2814 * @template TValue of object = object
2915 *
30- * @template-implements \IteratorAggregate<TKey, TValue>
16+ * @template-implements \IteratorAggregate<TObservable, TValue>
17+ * @template-implements ObservableMapInterface<TObservable, TValue>
3118 */
32- final readonly class ObservableWeakMap implements \IteratorAggregate, \Countable
19+ final readonly class ObservableWeakMap implements
20+ ObservableMapInterface,
21+ \IteratorAggregate
3322{
3423 /**
35- * @var \WeakMap<TKey , ReferenceReleaseCallback<TValue>>
24+ * @var \WeakMap<TObservable , ReferenceReleaseCallback<TValue>>
3625 */
3726 private \WeakMap $ memory ;
3827
@@ -41,25 +30,13 @@ public function __construct()
4130 $ this ->memory = new \WeakMap ();
4231 }
4332
44- /**
45- * @param TKey $key
46- * @param TValue $value
47- * @param \Closure(TValue):void $onRelease
48- *
49- * @return TKey
50- */
5133 public function watch (object $ key , object $ value , \Closure $ onRelease ): object
5234 {
5335 $ this ->memory [$ key ] = new ReferenceReleaseCallback ($ value , $ onRelease );
5436
5537 return $ key ;
5638 }
5739
58- /**
59- * @param TKey $key
60- *
61- * @return TValue|null
62- */
6340 public function find (object $ key ): ?object
6441 {
6542 if (!$ this ->memory ->offsetExists ($ key )) {
@@ -69,6 +46,16 @@ public function find(object $key): ?object
6946 return $ this ->memory [$ key ]->reference ;
7047 }
7148
49+ public function has (object $ key ): bool
50+ {
51+ return $ this ->memory ->offsetExists ($ key );
52+ }
53+
54+ public function detach (object $ key ): void
55+ {
56+ unset($ this ->memory [$ key ]);
57+ }
58+
7259 public function getIterator (): \Traversable
7360 {
7461 foreach ($ this ->memory as $ key => $ ref ) {
0 commit comments