Skip to content

Commit

Permalink
Fixing #262 - Signal/Computed should override value and not trigger c…
Browse files Browse the repository at this point in the history
…allback
  • Loading branch information
rodydavis committed May 8, 2024
1 parent cd1711f commit 2fe3c7b
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 34 deletions.
19 changes: 7 additions & 12 deletions packages/signals_core/lib/src/core/computed.dart
Expand Up @@ -356,7 +356,7 @@ class Computed<T> extends ReadonlySignal<T> implements SignalListenable {
@override
late T _value;

final ComputedCallback<T> _fn;
ComputedCallback<T> _fn;

@override
_Node? _sources;
Expand Down Expand Up @@ -386,8 +386,12 @@ class Computed<T> extends ReadonlySignal<T> implements SignalListenable {
/// // Override the signal with a new value
/// counter = counter.overrideWith(1);
/// ```
Computed<T> overrideWith(T value) {
this._reset(value);
Computed<T> overrideWith(T val) {
_fn = () => val;
_flags = _OUTDATED;
// _version = 0;
_initialValue = val;
_previousValue = null;
return this;
}

Expand Down Expand Up @@ -535,15 +539,6 @@ class Computed<T> extends ReadonlySignal<T> implements SignalListenable {
_flags |= _DISPOSED;
}

void _reset(T? value) {
_refresh();
if (value != null) {
_value = value;
_initialValue = value;
_previousValue = null;
}
}

@override
T get initialValue => _initialValue;
late T _initialValue;
Expand Down
15 changes: 4 additions & 11 deletions packages/signals_core/lib/src/core/signal.dart
Expand Up @@ -301,15 +301,6 @@ class Signal<T> extends ReadonlySignal<T> {
return _value;
}

void _reset(T? value) {
if (value != null) {
_value = value;
_initialValue = value;
_previousValue = null;
}
_version = 0;
}

/// Returns a readonly signal
ReadonlySignal<T> readonly() => this;

Expand All @@ -323,8 +314,10 @@ class Signal<T> extends ReadonlySignal<T> {
/// // Override the signal with a new value
/// counter = counter.overrideWith(1);
/// ```
Signal<T> overrideWith(T value) {
this._reset(value);
Signal<T> overrideWith(T val) {
_version = 0;
_value = val;
_previousValue = null;
return this;
}
}
Expand Down
40 changes: 29 additions & 11 deletions packages/signals_core/test/core/computed_test.dart
Expand Up @@ -93,12 +93,16 @@ void main() {
});

test('overrideWith', () {
final a = signal(1);
final b = signal(2);
final c = computed(() => a() + b());
expect(c.value, 3);
c.overrideWith(10);
expect(c.value, 10);
int calls = 0;
var c = computed(() {
calls++;
return 1;
});

c.overrideWith(2);

expect(c.value, 2);
expect(calls, 0);
});

test('test as stream', () {
Expand All @@ -113,18 +117,32 @@ void main() {
expect(stream, emitsInOrder([0, 1, 2, 3]));
});

test('test override', () {
final a = signal(0);
final s = computed(() => a()).overrideWith(-1);
test('test override subscribe', () {
final a = signal(1);

final stream = s.toStream();
int calls = 0;
List<int> results = [];
var c = computed(() {
calls++;
return a();
});

c.overrideWith(2);

expect(results, []);
expect(calls, 0);

final dispose = c.subscribe(results.add);

a.value = 1;
a.value = 2;
a.value = 2; // check if skipped
a.value = 3;

expect(stream, emitsInOrder([-1, 1, 2, 3]));
expect(calls, 0);
expect(results, [2]);

dispose();
});

test('should respect force set', () {
Expand Down

0 comments on commit 2fe3c7b

Please sign in to comment.