Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions packages/solidart/lib/src/core/alien.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
part of 'core.dart';

class _AlienComputed<T> extends alien.ReactiveNode implements _AlienUpdatable {
// flags: ReactiveFlags.mutable | ReactiveFlags.dirty
_AlienComputed(this.parent, this.getter)
: super(flags: 17 as alien.ReactiveFlags);
: super(flags: 17 /* Mutable | Dirty */);

final Computed<T> parent;
final T Function(T? oldValue) getter;
Expand All @@ -30,7 +29,9 @@ class _AlienComputed<T> extends alien.ReactiveNode implements _AlienUpdatable {
class _AlienEffect extends alien.ReactiveNode {
_AlienEffect(this.parent, this.run, {bool? detach})
: detach = detach ?? SolidartConfig.detachEffects,
super(flags: alien.ReactiveFlags.watching);
super(flags: 2 /* Watching */);

_AlienEffect? nextEffect;

final bool detach;
final Effect parent;
Expand All @@ -42,7 +43,7 @@ class _AlienEffect extends alien.ReactiveNode {
class _AlienSignal<T> extends alien.ReactiveNode implements _AlienUpdatable {
_AlienSignal(this.parent, this.value)
: previousValue = value,
super(flags: alien.ReactiveFlags.mutable);
super(flags: 1 /* Mutable */);

final SignalBase<dynamic> parent;

Expand All @@ -53,7 +54,7 @@ class _AlienSignal<T> extends alien.ReactiveNode implements _AlienUpdatable {

@override
bool update() {
flags = alien.ReactiveFlags.mutable;
flags = 1 /* Mutable */;
if (forceDirty) {
forceDirty = false;
return true;
Expand Down
3 changes: 0 additions & 3 deletions packages/solidart/lib/src/core/core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import 'dart:developer' as dev;
import 'dart:math';

import 'package:alien_signals/alien_signals.dart' as alien;
// ignore: implementation_imports
import 'package:alien_signals/src/preset.dart' as alien show EffectFlags;

import 'package:collection/collection.dart';
import 'package:meta/meta.dart';
import 'package:solidart/src/utils.dart';
Expand Down
66 changes: 33 additions & 33 deletions packages/solidart/lib/src/core/reactive_system.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// ignore: lines_longer_than_80_chars
// ignore_for_file: public_member_api_docs, parameter_assignments, library_private_types_in_public_api
//
// Reactive flags map: https://github.com/medz/alien-signals-dart/blob/main/flags.md
part of 'core.dart';

typedef ReactionErrorHandler = void Function(
Expand All @@ -25,24 +27,24 @@ class ReactiveName {
final reactiveSystem = ReactiveSystem();

class ReactiveSystem extends alien.ReactiveSystem {
final queuedEffects = <int, alien.ReactiveNode?>{};
final pauseStack = <alien.ReactiveNode>[];

int batchDepth = 0;
int notifyIndex = 0;
int queuedEffectsLength = 0;
alien.ReactiveNode? activeSub;
_AlienEffect? queuedEffects;
_AlienEffect? queuedEffectsTail;

@override
void notify(alien.ReactiveNode node) {
final flags = node.flags;
if ((flags & alien.EffectFlags.queued) == 0) {
node.flags = flags | alien.EffectFlags.queued;
if ((flags & 64 /* Queued */) == 0) {
node.flags = flags | 64 /* Queued */;
final subs = node.subs;
if (subs != null) {
notify(subs.sub);
} else if (queuedEffectsTail != null) {
queuedEffectsTail =
queuedEffectsTail!.nextEffect = node as _AlienEffect;
} else {
queuedEffects[queuedEffectsLength++] = node;
queuedEffectsTail = queuedEffects = node as _AlienEffect;
}
}
}
Expand All @@ -52,8 +54,7 @@ class ReactiveSystem extends alien.ReactiveSystem {
if (node is _AlienComputed) {
var toRemove = node.deps;
if (toRemove != null) {
// ReactiveFlags.mutable | ReactiveFlags.dirty
node.flags = 17 as alien.ReactiveFlags;
node.flags = 17 /* Mutable | Dirty */;
do {
toRemove = unlink(toRemove!, node);
} while (toRemove != null);
Expand Down Expand Up @@ -85,15 +86,15 @@ class ReactiveSystem extends alien.ReactiveSystem {

T getComputedValue<T>(_AlienComputed<T> computed) {
final flags = computed.flags;
if ((flags & alien.ReactiveFlags.dirty) != 0 ||
((flags & alien.ReactiveFlags.pending) != 0 &&
if ((flags & 16 /* Dirty */) != 0 ||
((flags & 32 /* Pending */) != 0 &&
checkDirty(computed.deps!, computed))) {
if (computed.update()) {
final subs = computed.subs;
if (subs != null) shallowPropagate(subs);
}
} else if ((flags & alien.ReactiveFlags.pending) != 0) {
computed.flags = flags & -33 /* ~ReactiveFlags.pending */;
} else if ((flags & 32 /* Pending */) != 0) {
computed.flags = flags & -33 /* ~Pending */;
}
if (activeSub != null) {
link(computed, activeSub!);
Expand All @@ -104,7 +105,7 @@ class ReactiveSystem extends alien.ReactiveSystem {

Option<T> getSignalValue<T>(_AlienSignal<T> signal) {
final value = signal.value;
if ((signal.flags & alien.ReactiveFlags.dirty) != 0) {
if ((signal.flags & 16 /* Dirty */) != 0) {
if (signal.update()) {
final subs = signal.subs;
if (subs != null) shallowPropagate(subs);
Expand All @@ -117,8 +118,7 @@ class ReactiveSystem extends alien.ReactiveSystem {

void setSignalValue<T>(_AlienSignal<T> signal, Option<T> value) {
if (signal.value != (signal.value = value)) {
signal.flags = 17
as alien.ReactiveFlags; // ReactiveFlags.mutable | ReactiveFlags.dirty
signal.flags = 17 /* Mutable | Dirty */;
final subs = signal.subs;
if (subs != null) {
propagate(subs);
Expand All @@ -136,13 +136,12 @@ class ReactiveSystem extends alien.ReactiveSystem {

final sub = effect.subs;
if (sub != null) unlink(sub, effect);
effect.flags = alien.ReactiveFlags.none;
effect.flags = 0 /* None */;
}

void run(alien.ReactiveNode effect, alien.ReactiveFlags flags) {
if ((flags & alien.ReactiveFlags.dirty) != 0 ||
((flags & alien.ReactiveFlags.pending) != 0 &&
checkDirty(effect.deps!, effect))) {
void run(alien.ReactiveNode effect, int flags) {
if ((flags & 16 /* Dirty */) != 0 ||
((flags & 32 /* Pending */) != 0 && checkDirty(effect.deps!, effect))) {
final prevSub = setCurrentSub(effect);
startTracking(effect);
try {
Expand All @@ -152,29 +151,30 @@ class ReactiveSystem extends alien.ReactiveSystem {
endTracking(effect);
}
return;
} else if ((flags & alien.ReactiveFlags.pending) != 0) {
effect.flags = flags & -33 /* ~ReactiveFlags.pending */;
} else if ((flags & 32 /* Pending */) != 0) {
effect.flags = flags & -33 /* ~Pending */;
}
var link = effect.deps;
while (link != null) {
final dep = link.dep;
final depFlags = dep.flags;
if ((depFlags & alien.EffectFlags.queued) != 0) {
run(dep, dep.flags = depFlags & -65 /* ~EffectFlags.queued */);
if ((depFlags & 64 /* Queued */) != 0) {
run(dep, dep.flags = depFlags & -65 /* ~Queued */);
}
link = link.nextDep;
}
}

void flush() {
try {
while (notifyIndex < queuedEffectsLength) {
final effect = queuedEffects[notifyIndex];
queuedEffects[notifyIndex++] = null;
run(effect!, effect.flags &= -65 /* ~EffectFlags.queued */);
while (queuedEffects != null) {
final effect = queuedEffects!;
if ((queuedEffects = effect.nextEffect) != null) {
effect.nextEffect = null;
} else {
queuedEffectsTail = null;
}
} finally {
notifyIndex = queuedEffectsLength = 0;

run(effect, effect.flags &= -65 /* ~Queued */);
}
}
}
2 changes: 1 addition & 1 deletion packages/solidart/lib/src/core/read_signal.dart
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ class ReadableSignal<T> implements ReadSignal<T> {
/// use [reactiveSystem.setSignalValue] instead.
void _reportChanged() {
_internalSignal.forceDirty = true;
_internalSignal.flags = 17 as alien.ReactiveFlags;
_internalSignal.flags = 17 /* Mutable | Dirty */;
final subs = _internalSignal.subs;
if (subs != null) {
// coverage:ignore-start
Expand Down
2 changes: 1 addition & 1 deletion packages/solidart/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ resolution: workspace

dependencies:
# we depend on the alien signals reactivity implementation because it's the fastest available right now (30/12/2024)
alien_signals: ^0.4.3
alien_signals: ^0.5.1
collection: ^1.18.0
meta: ^1.11.0

Expand Down