effect method

void effect(
  1. void callback(),
  2. List<NeuronAtom> dependencies, {
  3. bool fireImmediately = true,
})

Run a side effect whenever dependencies change.

The effect runs immediately and whenever any dependency changes. Effects are automatically cleaned up when the controller is disposed.

Example:

class MyController extends NeuronController {
  late final count = Signal<int>(0).bind(this);
  late final name = Signal<String>('').bind(this);

  @override
  void onInit() {
    // Log whenever count or name changes
    effect(() {
      print('State: count=${count.val}, name=${name.val}');
    }, [count, name]);

    // Save to storage when count changes
    effect(() {
      storage.save('count', count.val);
    }, [count]);
  }
}

Implementation

void effect(
  void Function() callback,
  List<NeuronAtom> dependencies, {
  bool fireImmediately = true,
}) {
  if (fireImmediately) {
    callback();
  }

  final listeners = <VoidCallback>[];
  for (final dep in dependencies) {
    void listener() => callback();
    listeners.add(listener);
    dep.addListener(listener);
  }

  // Store effect disposer for cleanup
  _autoDispose(_EffectDisposer(dependencies, listeners));
}