Skip to content

Commit

Permalink
refactor: system alien_signals
Browse files Browse the repository at this point in the history
medz committed Jan 17, 2025
1 parent 0b18d64 commit a9febbc
Showing 13 changed files with 65 additions and 60 deletions.
13 changes: 7 additions & 6 deletions pub/flutter_alien_signals/lib/src/_internal/signals_element.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import 'package:alien_signals/alien_signals.dart';
import 'package:alien_signals/preset.dart';
import 'package:flutter/widgets.dart';

import 'utils.dart';

SignalsElement? currentElement;

mixin SignalsElement on ComponentElement {
EffectScope get scope;
Effect get effect;
EffectStop<EffectScope> get scopeStop;
EffectStop<Effect> get effectStop;

final signals = <Signal>[];
final subs = <Subscriber>[];
@@ -17,7 +18,7 @@ mixin SignalsElement on ComponentElement {
@override
Widget build() {
final prevElement = currentElement;
final reset = effect.on(scope);
final reset = effectStop.sub.on(scopeStop.sub);
currentElement = this;
signalCounter = subCounter = 0;
try {
@@ -32,8 +33,8 @@ mixin SignalsElement on ComponentElement {

if (stopSubs.isEmpty) {
for (final sub in stopSubs) {
startTrack(sub);
endTrack(sub);
system.startTracking(sub);
system.endTracking(sub);
}
}
}
@@ -43,7 +44,7 @@ mixin SignalsElement on ComponentElement {
void unmount() {
signals.clear();
subs.clear();
scope.stop();
scopeStop();
super.unmount();
}
}
23 changes: 14 additions & 9 deletions pub/flutter_alien_signals/lib/src/_internal/utils.dart
Original file line number Diff line number Diff line change
@@ -1,23 +1,28 @@
import 'package:alien_signals/alien_signals.dart';
import 'package:alien_signals/preset.dart';

void loop() {}

extension EffectScopeUtils on EffectScope {
void Function() on() {
final prevScope = activeEffectScope;
setActiveScope(this);
return () => setActiveScope(prevScope);
final prevScope = system.activeScope;
system.activeScope = this;
return () {
system.activeScope = prevScope;
};
}
}

extension EffectUtils on Effect {
void Function() on([EffectScope? scope]) {
final reset = scope?.on();
final prevSub = activeSub;
setActiveSub(this);
startTrack(this);
final prevSub = system.activeSub;

system.activeSub = this;
system.startTracking(this);
return () {
reset?.call();
setActiveSub(prevSub);
endTrack(this);
system.activeSub = prevSub;
system.endTracking(this);
};
}
}
2 changes: 1 addition & 1 deletion pub/flutter_alien_signals/lib/src/api_batch.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:alien_signals/alien_signals.dart';
import 'package:alien_signals/preset.dart';

T batch<T>(T Function() fn) {
startBatch();
2 changes: 1 addition & 1 deletion pub/flutter_alien_signals/lib/src/api_computed.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:alien_signals/alien_signals.dart' as alien;
import 'package:alien_signals/preset.dart' as alien;

import '_internal/callonce.dart';
import '_internal/signals_element.dart';
9 changes: 5 additions & 4 deletions pub/flutter_alien_signals/lib/src/api_effect.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import 'package:alien_signals/alien_signals.dart' as alien;
import 'package:alien_signals/preset.dart' as alien;

import '_internal/callonce.dart';
import '_internal/signals_element.dart';

alien.Effect<T> effect<T>(T Function() fn) {
alien.EffectStop<alien.Effect> effect<T>(T Function() fn) {
if (currentElement == null) {
return alien.effect(fn);
}

final element = currentElement!, subs = element.subs;
try {
return callonce(
factory: () => alien.effect(fn),
final effect = callonce(
factory: () => alien.effect(fn).sub,
container: subs,
index: element.subCounter,
);
return alien.EffectStop(effect);
} finally {
element.subCounter++;
}
11 changes: 6 additions & 5 deletions pub/flutter_alien_signals/lib/src/api_effect_scope.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import 'package:alien_signals/alien_signals.dart' as alien;
import 'package:alien_signals/preset.dart' as alien;

import '_internal/callonce.dart';
import '_internal/signals_element.dart';

alien.EffectScope effectScope() {
alien.EffectStop<alien.EffectScope> effectScope(void Function() fn) {
if (currentElement == null) {
return alien.effectScope();
return alien.effectScope(fn);
}

final element = currentElement!, subs = element.subs;
try {
return callonce(
factory: alien.effectScope,
final scope = callonce(
factory: () => alien.effectScope(fn).sub,
container: subs,
index: element.subCounter,
);
return alien.EffectStop(scope);
} finally {
element.subCounter++;
}
4 changes: 2 additions & 2 deletions pub/flutter_alien_signals/lib/src/api_signal.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:alien_signals/alien_signals.dart' as alien;
import 'package:alien_signals/preset.dart' as alien;

import '_internal/callonce.dart';
import '_internal/signals_element.dart';

alien.Signal<T> signal<T>(T value) {
alien.WriteableSignal<T> signal<T>(T value) {
if (currentElement == null) {
return alien.signal(value);
}
10 changes: 5 additions & 5 deletions pub/flutter_alien_signals/lib/src/compat.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'upstream.dart';

extension ValueSignal<T> on ISignal<T> {
T get value => get();
extension ValueSignal<T> on Signal<T> {
T get value => this();
}

extension ValueWritableSignal<T> on IWritableSignal<T> {
T get value => get();
set value(T value) => set(value);
extension ValueWritableSignal<T> on WriteableSignal<T> {
T get value => this();
set value(T value) => this(value);
}
13 changes: 8 additions & 5 deletions pub/flutter_alien_signals/lib/src/mixins/signals.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import 'package:alien_signals/alien_signals.dart';
import 'package:alien_signals/preset.dart';
import 'package:flutter/widgets.dart';

import '../_internal/signals_element.dart';
import '../_internal/utils.dart';

mixin Signals on StatelessWidget {
@override
@@ -11,13 +12,15 @@ mixin Signals on StatelessWidget {
}

class _StatelessSignalsElement extends StatelessElement with SignalsElement {
_StatelessSignalsElement(super.widget) : scope = effectScope() {
effect = scope.run(() => Effect(markNeedsBuild));
_StatelessSignalsElement(super.widget) : scopeStop = effectScope(loop) {
system.runEffectScope(scopeStop.sub, () {
effectStop = effect(markNeedsBuild);
});
}

@override
final EffectScope scope;
final EffectStop<EffectScope> scopeStop;

@override
late final Effect effect;
late final EffectStop<Effect> effectStop;
}
20 changes: 11 additions & 9 deletions pub/flutter_alien_signals/lib/src/mixins/state_signals.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:alien_signals/alien_signals.dart';
import 'package:alien_signals/preset.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart';

@@ -8,30 +8,32 @@ import '../_internal/utils.dart';
mixin StateSignals on StatefulWidget {
@override
StatefulElement createElement() {
final scope = effectScope();
final reset = scope.on();
final stop = effectScope(loop);
final reset = stop.sub.on();
try {
return _SignalsElement(this, scope);
return _SignalsElement(this, stop);
} finally {
reset();
}
}
}

class _SignalsElement extends StatefulElement with SignalsElement {
_SignalsElement(super.widget, this.scope) {
effect = scope.run(() => Effect(markNeedsBuild));
_SignalsElement(super.widget, this.scopeStop) {
system.runEffectScope(scopeStop.sub, () {
effectStop = effect(markNeedsBuild);
});
}

@override
final EffectScope scope;
final EffectStop<EffectScope> scopeStop;

@override
late final Effect effect;
late final EffectStop<Effect> effectStop;

@override
void mount(Element? parent, Object? newSlot) {
final reset = scope.on();
final reset = scopeStop.sub.on();
try {
super.mount(parent, newSlot);
} finally {
12 changes: 2 additions & 10 deletions pub/flutter_alien_signals/lib/src/upstream.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,2 @@
export 'package:alien_signals/alien_signals.dart'
show
Signal,
Computed,
Effect,
EffectScope,
ISignal,
IWritableSignal,
untrack,
untrackScope;
export 'package:alien_signals/preset.dart'
show Signal, WriteableSignal, Computed, Effect, EffectScope;
Original file line number Diff line number Diff line change
@@ -11,6 +11,6 @@ class SignalObserver<T> extends SignalsWidget {

@override
Widget build(BuildContext context) {
return builder(context, signal.get());
return builder(context, signal());
}
}
4 changes: 2 additions & 2 deletions pub/flutter_alien_signals/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: flutter_alien_signals
description: >-
Flutter Alien Signals is a Flutter binding based on Alien Signals.
version: 0.1.0
version: 0.2.0
repository: https://github.com/medz/alien-signals-dart/tree/main/pub/flutter_alien_signals
homepage: https://github.com/medz/alien-signals-dart

@@ -24,7 +24,7 @@ environment:
dependencies:
flutter:
sdk: flutter
alien_signals: ^0.1.0
alien_signals: ^0.2.0

dev_dependencies:
flutter_test:

0 comments on commit a9febbc

Please sign in to comment.