Skip to content

Commit

Permalink
feat: queued dispose system
Browse files Browse the repository at this point in the history
  • Loading branch information
arxdeus committed Mar 4, 2025
1 parent d4aebb2 commit 7f26f89
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 24 deletions.
11 changes: 8 additions & 3 deletions packages/modulisto/lib/src/internal.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ abstract class ModuleBase implements DisposerHolder {

bool get isClosed;

abstract final Queue<Disposable> $linkedDisposables;
@override
abstract final Queue<FutureOr<void> Function()> $disposeQueue;
abstract final Stream<RawUnitIntent> $intentStream;
void $addIntent<T>(UnitIntent<T, Object?> intent);
}
Expand Down Expand Up @@ -53,8 +54,12 @@ abstract class Attachable {

abstract class DisposerHolder {
@internal
List<void Function()> get $disposers;
Queue<FutureOr<void> Function()> get $disposeQueue;
}

@internal
abstract class PipelineRef implements IntentHandler, DisposerHolder {}
abstract class PipelineRef implements IntentHandler, DisposerHolder {
@override
@internal
Queue<FutureOr<void> Function()> get $disposeQueue;
}
20 changes: 7 additions & 13 deletions packages/modulisto/lib/src/module.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -18,12 +17,13 @@ abstract base class Module extends ModuleBase implements Disposable, Named {
module._lifecycle.init();
}

@override
@internal
late final List<void Function()> $disposers = [];

bool _isClosed = false;

@override
@internal
@nonVirtual
@visibleForTesting
late final Queue<FutureOr<void> Function()> $disposeQueue = Queue();
late final _lifecycle = (
init: Trigger<()>(this),
dispose: Trigger<()>(this),
Expand All @@ -32,21 +32,15 @@ abstract base class Module extends ModuleBase implements Disposable, Named {
@nonVirtual
ModuleLifecycle get lifecycle => _lifecycle;

@override
@protected
@visibleForTesting
@nonVirtual
late final Queue<PipelineUnit> $linkedDisposables = Queue();

final StreamController<RawUnitIntent> _intentController = StreamController.broadcast();

@override
Future<void> dispose() async {
_lifecycle.dispose();
_isClosed = true;

for (final disposable in $linkedDisposables) {
await disposable.dispose();
for (final dispose in $disposeQueue) {
await dispose();
}
await _intentController.close();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class StreamPipelineLinker<T> implements PipelineLinker<Stream<T>, T> {
@override
void bind(FutureOr<void> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class UnitPipelineLinker<T> implements PipelineLinker<Unit<T>, T> {
void bind(FutureOr<void> Function(PipelineContext context, T value) handler) {
final callback = pipelineRef.$handle(_unit, handler);
_unit.addListener(callback);
pipelineRef.$disposers.add(_unit.dispose);
}

@override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:collection';

import 'package:meta/meta.dart';
import 'package:modulisto/src/interfaces.dart';
Expand Down Expand Up @@ -33,7 +34,7 @@ final class AsyncPipeline extends PipelineUnit implements AsyncPipelineRef, Inte
late final List<Future<void>> _pendingEvents = [];
@override
@internal
late final List<void Function()> $disposers = [];
late final Queue<void Function()> $disposeQueue = Queue();

late final Stream<RawPipelineIntent> _intentStream = _transformer(
module.$intentStream.whereType<RawPipelineIntent>().where((intent) => intent.source == this),
Expand All @@ -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
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:collection';

import 'package:meta/meta.dart';
import 'package:modulisto/src/interfaces.dart';
Expand All @@ -25,7 +26,7 @@ final class SyncPipeline extends PipelineUnit implements SyncPipelineRef, Intent

@override
@internal
late final List<void Function()> $disposers = [];
late final Queue<void Function()> $disposeQueue = Queue();

@override
void Function(T value) $handle<T>(
Expand All @@ -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();
Expand Down

0 comments on commit 7f26f89

Please sign in to comment.