Skip to content

Commit c6d3ea2

Browse files
committed
Add batch and untracked utility functions
1 parent 3ef0fde commit c6d3ea2

4 files changed

Lines changed: 86 additions & 1 deletion

File tree

packages/solidart/lib/src/v3.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,24 @@ final class SolidartConfig {
4141
static bool trackPreviousValue = true;
4242
}
4343

44+
T untracked<T>(T Function() callback) {
45+
final prevSub = preset.setActiveSub();
46+
try {
47+
return callback();
48+
} finally {
49+
preset.setActiveSub(prevSub);
50+
}
51+
}
52+
53+
T batch<T>(T Function() fn) {
54+
preset.startBatch();
55+
try {
56+
return fn();
57+
} finally {
58+
preset.endBatch();
59+
}
60+
}
61+
4462
class Identifier {
4563
Identifier._(this.name) : value = _counter++;
4664
static int _counter = 0;

packages/solidart/lib/v3.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
// TODO(medz): rename the v3.dart to solidart.dart filename.
22

33
export 'src/v3.dart'
4-
show Computed, Effect, LazySignal, ReadonlySignal, Signal, SolidartConfig;
4+
show
5+
Computed,
6+
Effect,
7+
LazySignal,
8+
ReadonlySignal,
9+
Signal,
10+
SolidartConfig,
11+
batch,
12+
untracked;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'package:solidart/v3.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
test('batch groups updates and flushes once', () {
6+
final x = Signal(10);
7+
final y = Signal(20);
8+
final total = Signal(30);
9+
10+
final calls = <({int x, int y, int total})>[];
11+
12+
Effect(() {
13+
calls.add((x: x.value, y: y.value, total: total.value));
14+
});
15+
16+
expect(calls, [
17+
(x: 10, y: 20, total: 30),
18+
]);
19+
20+
batch(() {
21+
x.value++;
22+
y.value++;
23+
total.value = x.value + y.value;
24+
});
25+
26+
expect(calls, [
27+
(x: 10, y: 20, total: 30),
28+
(x: 11, y: 21, total: 32),
29+
]);
30+
});
31+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import 'package:solidart/v3.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
test('untracked prevents dependency tracking', () {
6+
final count = Signal(0);
7+
final effectCount = Signal(0);
8+
var runs = 0;
9+
10+
Effect(() {
11+
count.value;
12+
runs++;
13+
effectCount.value = untracked(() => effectCount.value + 1);
14+
});
15+
16+
expect(runs, 1);
17+
expect(effectCount.value, 1);
18+
19+
count.value = 1;
20+
21+
expect(runs, 2);
22+
expect(effectCount.value, 2);
23+
24+
effectCount.value = 3;
25+
26+
expect(runs, 2);
27+
});
28+
}

0 commit comments

Comments
 (0)