genesis_tree 0.1.5
genesis_tree: ^0.1.5 copied to clipboard
A framework-agnostic Seed/Branch keyed-reconcile tree engine — Flutter's element/reconciliation model extracted to pure, bare-VM Dart.
Changelog #
0.1.5 #
- Docs only, no API changes. The README gains "The artifact layer —
deliberately not shipped":
genesis_treereconciles desired state into live identity and stops there — what that identity spawns and owns is the consumer's, unbundled into four pieces (artifacts / owner / protocol / affordance scopes), withgenesis_typesettingandgenesis_perceptionas the worked examples. The composition-layer list also catches up to 0.1.4 (MultiChildSeed, theSingleChildSeed/Nestchain).
0.1.4 #
-
Add the single-child chain vocabulary.
SingleChildStatelessSeedandSingleChildStatefulSeed(withSingleChildState) are the single-child analogues ofStatelessSeed/StatefulSeed: their build receives the downstream child to embed (buildWithChild).Neststacks a list of them into a vertical spine, each wrapping the next down to one leafchild— theNested/MultiProvidershape, generic (no inherited-value semantics baked in).MultiChildSeedfans out horizontally;Nestcomposes vertically. Fullyconst-constructible: the children are referenced as authored and never reconstructed — each link's downstream is supplied at the branch layer — so an unchangedNestprunes its whole chain on reconcile, while a change to the leaf or any link propagates through it. EXPERIMENTAL. -
Add
getInheritedSeedOfExactType<T>()— the dependency-free counterpart ofdependOnInheritedSeedOfExactType<T>(). Same nearest-ancestor lookup, same value result, but the caller is not registered as a dependent: the returned value is a snapshot, and a later change to the provided value does not rebuild the reader. Use it for one-shot reads — grabbing an ambient service inState.initState, inside an effect, during teardown — and keep the depend variant wherever the branch must rebuild on change. Available onBranch,TreeContext, andSproutContext. Breaking for externalTreeContextimplementers (a new interface member); handles that wrap the canonical handle just delegate it. -
StatefulBranchnow asserts (debug-only) whendependOnInheritedSeedOfExactTypeis called duringinitStateordispose. IninitStatethe natural cache-the-result pattern goes stale when the provider changes (initState never re-runs) — read dependency-free with the new variant, or cache-and-track indidChangeDependencies. Indisposethe branch is unmounting and can never observe a change. -
There is deliberately no "get the provider element" lookup (Flutter's
getElementForInheritedWidgetOfExactType): the capability handle never exposes aBranch.
0.1.3 #
- Breaking: a first-class
Keyvalue-type.Seed.key(andBranch.key,TreeContext.key) is now typedKey?instead ofObject?. Two concrete kinds ship:ValueKey<T>(value)(value equality; the type parameter is part of identity, soValueKey<int>(1) != ValueKey<num>(1)) andObjectKey(value)(identity equality), plus an ergonomicconst Key(String)factory that builds aValueKey<String>. The typed key gives reconciliation identity intent and type-safety and a shared identity story for keyed list reconcile. Keyis open (abstract, not sealed): domains extend it with their own key kinds. There is deliberately noGlobalKey— cross-tree lookup is refused so the tree stays one-way (cross-boundary references pass handles through the parent) — and noLocalKeylayer (vacuous without a global key).- Migration: replace
key: 'id'withkey: ValueKey('id')(orKey('id')), andseed.key == 'id'comparisons withseed.key == ValueKey('id'). - Add
MultiChildSeed/MultiChildBranchto the (experimental) composition layer: a config-declared multi-child container that keyed-reconciles itsList<Seed> childrenviaBranch.updateChildren— theMultiChildRenderObjectElementanalogue, beside the single-childStatelessSeed/StatefulSeed/Sprout. Matched children (keyed by key, unkeyed by position) keep their branch identity across rebuilds; new children mount, removed children unmount, and child order followschildren. The identical-config skip fast path and the duplicate-sibling-key debug guard are inherited fromBranch. Additive; the spine is unchanged.
0.1.2 #
- Add a debug assertion that sibling keys are unique within
updateChildren(debug-mode only; surfaces duplicate-key reconcile bugs earlier, no release-mode behavior change).
0.1.1 #
- Docs: package documentation (README, dartdoc) made self-contained for pub.dev.
- Reworded the
TreeContextuse-after-unmountStateErrormessage (text only; no behavior change).
0.1.0 #
-
Initial release: the Seed/Branch keyed-reconcile engine — TreeContext (a separate capability handle), TreeOwner, the composition layer (Stateless/Stateful/State, InheritedSeed, Watch, Sprout), and the identical-config skip fast path.
Pre-1.0 and experimental; APIs may change before 1.0.