From 7f26f89e219803835113578c1c9571b69fcd46bf Mon Sep 17 00:00:00 2001 From: kitsuniru Date: Wed, 5 Mar 2025 02:16:49 +0300 Subject: [PATCH] feat: queued dispose system --- packages/modulisto/lib/src/internal.dart | 11 +++++++--- packages/modulisto/lib/src/module.dart | 20 +++++++------------ .../unit/pipeline/linker/stream_linker.dart | 2 +- .../src/unit/pipeline/linker/unit_linker.dart | 1 - .../unit/pipeline/type/async_pipeline.dart | 7 ++++--- .../src/unit/pipeline/type/sync_pipeline.dart | 7 ++++--- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/modulisto/lib/src/internal.dart b/packages/modulisto/lib/src/internal.dart index c3eb5a5..55d024f 100644 --- a/packages/modulisto/lib/src/internal.dart +++ b/packages/modulisto/lib/src/internal.dart @@ -15,7 +15,8 @@ abstract class ModuleBase implements DisposerHolder { bool get isClosed; - abstract final Queue $linkedDisposables; + @override + abstract final Queue Function()> $disposeQueue; abstract final Stream $intentStream; void $addIntent(UnitIntent intent); } @@ -53,8 +54,12 @@ abstract class Attachable { abstract class DisposerHolder { @internal - List get $disposers; + Queue Function()> get $disposeQueue; } @internal -abstract class PipelineRef implements IntentHandler, DisposerHolder {} +abstract class PipelineRef implements IntentHandler, DisposerHolder { + @override + @internal + Queue Function()> get $disposeQueue; +} diff --git a/packages/modulisto/lib/src/module.dart b/packages/modulisto/lib/src/module.dart index 33e4a89..e75f139 100644 --- a/packages/modulisto/lib/src/module.dart +++ b/packages/modulisto/lib/src/module.dart @@ -4,7 +4,6 @@ import 'dart:collection'; import 'package:meta/meta.dart'; import 'package:modulisto/src/interfaces.dart'; import 'package:modulisto/src/internal.dart'; -import 'package:modulisto/src/unit/pipeline/pipeline.dart'; import 'package:modulisto/src/unit/trigger.dart'; abstract base class Module extends ModuleBase implements Disposable, Named { @@ -18,12 +17,13 @@ abstract base class Module extends ModuleBase implements Disposable, Named { module._lifecycle.init(); } - @override - @internal - late final List $disposers = []; - bool _isClosed = false; + @override + @internal + @nonVirtual + @visibleForTesting + late final Queue Function()> $disposeQueue = Queue(); late final _lifecycle = ( init: Trigger<()>(this), dispose: Trigger<()>(this), @@ -32,12 +32,6 @@ abstract base class Module extends ModuleBase implements Disposable, Named { @nonVirtual ModuleLifecycle get lifecycle => _lifecycle; - @override - @protected - @visibleForTesting - @nonVirtual - late final Queue $linkedDisposables = Queue(); - final StreamController _intentController = StreamController.broadcast(); @override @@ -45,8 +39,8 @@ abstract base class Module extends ModuleBase implements Disposable, Named { _lifecycle.dispose(); _isClosed = true; - for (final disposable in $linkedDisposables) { - await disposable.dispose(); + for (final dispose in $disposeQueue) { + await dispose(); } await _intentController.close(); } diff --git a/packages/modulisto/lib/src/unit/pipeline/linker/stream_linker.dart b/packages/modulisto/lib/src/unit/pipeline/linker/stream_linker.dart index 637e26f..e8f2e41 100644 --- a/packages/modulisto/lib/src/unit/pipeline/linker/stream_linker.dart +++ b/packages/modulisto/lib/src/unit/pipeline/linker/stream_linker.dart @@ -17,7 +17,7 @@ class StreamPipelineLinker implements PipelineLinker, T> { @override void bind(FutureOr Function(PipelineContext context, T value) handler) { final sub = _stream.listen(pipelineRef.$handle(_stream, handler)); - pipelineRef.$disposers.add(sub.cancel); + pipelineRef.$disposeQueue.add(sub.cancel); } @override diff --git a/packages/modulisto/lib/src/unit/pipeline/linker/unit_linker.dart b/packages/modulisto/lib/src/unit/pipeline/linker/unit_linker.dart index 05da485..5359487 100644 --- a/packages/modulisto/lib/src/unit/pipeline/linker/unit_linker.dart +++ b/packages/modulisto/lib/src/unit/pipeline/linker/unit_linker.dart @@ -18,7 +18,6 @@ class UnitPipelineLinker implements PipelineLinker, T> { void bind(FutureOr Function(PipelineContext context, T value) handler) { final callback = pipelineRef.$handle(_unit, handler); _unit.addListener(callback); - pipelineRef.$disposers.add(_unit.dispose); } @override diff --git a/packages/modulisto/lib/src/unit/pipeline/type/async_pipeline.dart b/packages/modulisto/lib/src/unit/pipeline/type/async_pipeline.dart index 0139e05..9706858 100644 --- a/packages/modulisto/lib/src/unit/pipeline/type/async_pipeline.dart +++ b/packages/modulisto/lib/src/unit/pipeline/type/async_pipeline.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'package:meta/meta.dart'; import 'package:modulisto/src/interfaces.dart'; @@ -33,7 +34,7 @@ final class AsyncPipeline extends PipelineUnit implements AsyncPipelineRef, Inte late final List> _pendingEvents = []; @override @internal - late final List $disposers = []; + late final Queue $disposeQueue = Queue(); late final Stream _intentStream = _transformer( module.$intentStream.whereType().where((intent) => intent.source == this), @@ -48,7 +49,7 @@ final class AsyncPipeline extends PipelineUnit implements AsyncPipelineRef, Inte void attachToModule(ModuleBase module) { pipelineRegister(this); _sub = _intentStream.listen(null); - module.$linkedDisposables.addFirst(this); + module.$disposeQueue.addFirst(dispose); } @override @@ -83,7 +84,7 @@ final class AsyncPipeline extends PipelineUnit implements AsyncPipelineRef, Inte await Future.wait(_pendingEvents); await _sub?.cancel(); - for (final disposer in $disposers) { + for (final disposer in $disposeQueue) { disposer(); } super.dispose(); diff --git a/packages/modulisto/lib/src/unit/pipeline/type/sync_pipeline.dart b/packages/modulisto/lib/src/unit/pipeline/type/sync_pipeline.dart index be22343..af891c3 100644 --- a/packages/modulisto/lib/src/unit/pipeline/type/sync_pipeline.dart +++ b/packages/modulisto/lib/src/unit/pipeline/type/sync_pipeline.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'package:meta/meta.dart'; import 'package:modulisto/src/interfaces.dart'; @@ -25,7 +26,7 @@ final class SyncPipeline extends PipelineUnit implements SyncPipelineRef, Intent @override @internal - late final List $disposers = []; + late final Queue $disposeQueue = Queue(); @override void Function(T value) $handle( @@ -37,13 +38,13 @@ final class SyncPipeline extends PipelineUnit implements SyncPipelineRef, Intent @override @protected void attachToModule(ModuleBase module) { - module.$linkedDisposables.addLast(this); + module.$disposeQueue.addLast(dispose); pipelineRegister(this); } @override void dispose() { - for (final disposer in $disposers) { + for (final disposer in $disposeQueue) { disposer(); } super.dispose();