Collections & objects
Engine-backed functional pipeline plus a reflective object root; boxed storage caps native set-op speed.
6 Strong · 5 Solid · 1 Partial · 0 Emerging
Measured against: Lodash · Immutable.js · standard libraries · Folders: base/list(opens in a new tab) · base/object(opens in a new tab) · For programmers: this area's reference

Rethought from first principles
What Softanza kept from what works, and what it rethought, as the library wrote it down in its design documents and narrations.
The Softanza wayThe same few questions — does it contain, how many, where — and the same verbs work on every structure; only the unit of position changes.
Kept from the best practice
- Default truth stays the platform's own: empty is false, something is true; IsTrue() behaves exactly like the native test before any extension. source(opens in a new tab)
- Keeps the usual safe-lookup discipline: check that a key exists (HasKey, HasPath) before reading it, so a lookup never silently creates an empty entry. source(opens in a new tab)
Rethought
- Strings and lists answer the same verbs — Contains, NumberOfOccurrence, FindAll — and StzFind accepts either, so one way of thinking covers every structure. source(opens in a new tab)
- A method's form carries its effect: Remove() changes the object, Removed() returns a changed copy, RemoveQ() chains, so side effects are visible in the name. source(opens in a new tab)
- Truth can be configured: IsTrueXT() lets a program declare which items or words make a list or string false, instead of one fixed empty-equals-false rule. source(opens in a new tab)
- An object can keep the story of its changes: QH() records every step of a chain, because a transformation normally leaves no trace of its path. source(opens in a new tab)
One of the largest surfaces in the library: ~155 list operations in a 6,500-line Zig core behind a 1,600-method Haro face, a functional pipeline, deep-path search, Lodash-grade grouping, and a reflective object root that 449 classes inherit, tuned for millions of items with measured residency wins. Two honest limits keep it short of the very top: boxed value storage holds raw set-op throughput an order of magnitude below NumPy/native, and there are no persistent immutable structures.
What a crafter does with it, and what stands out
- String-expression predicates run inside the engine, which the peers cannot do
- A deep-path search API that Lodash get only approximates
- A reflective object root 449 classes inherit, with Q-elevation and the Verb/Verbed/VerbQ grammar
- Measured residency wins at 1M items: 2.6x read-reuse, Classify -51%, Union -34%
What is owed
- Finish the list narration / fidelity grind (312 of ~602 legacy blocks error)
- Unboxed typed storage for native-speed set-ops
- Complete the residency migration (Slices 4 and 5, ~32 marshal-in sites)
- Persistent immutable collections with structural sharing
The Softanza way, run
What Softanza does differently in this area, shown by code taken from its narrations and guards, and run for this page.
One function finds a value in a string or in a list; only the unit changes, characters or items.
? @@( StzFind("tea", "tea rice tea fish") )
? @@( StzFind("tea", [ "tea", "rice", "tea", "fish" ]) )[ 1, 10 ] [ 1, 3 ]
run on 2026-10-01 21:17 inside the library at commit 0e72e2e2c; taken from base/education/program/courses/elementary-introduction/chapters/05-one-object-any-structure.en.md(opens in a new tab)
A chain of changes keeps its history: the starting value and the result of every step.
? @@( QH("1 AA 2 B 3 CCC 4 DD 5 Z").
RemoveCharsWQ('Q(@Char).IsNumberInString()').
RemoveSpacesQ().
RemoveDuplicatedCharsQ().
History() )[ "1 AA 2 B 3 CCC 4 DD 5 Z", " AA B CCC DD Z", "AABCCCDDZ", "ABCDZ" ]
run on 2026-10-01 21:17 inside the library at commit 0e72e2e2c; taken from base/test/string/466_keeping_the_history_of_updates_of_a_softanza_objec.ring(opens in a new tab)
Truth is configurable: once 'no' and 'off' are declared as markers, a string containing one counts as false.
SetSubStringsMakingAStringFalse([ "no", "off" ])
Then("a string carrying a marker is FALSE", IsTrueXT("no way"), FALSE)
Then("...and IsFalseXT says so", IsFalseXT("no way"), TRUE)
Then("a string without one is still TRUE", IsTrueXT("Hello"), TRUE)THEN a string carrying a marker is FALSE [PASS] THEN ...and IsFalseXT says so [PASS] THEN a string without one is still TRUE [PASS]
run on 2026-10-01 21:17 inside the library at commit 0e72e2e2c; taken from base/test/func/00_func_narrated.ring(opens in a new tab)
The articles of this area (15)
- Understanding Section Merging Features in Softanza 2024
- The Narrative of Transformations: Tracking Object History in Softanza 2024
- Unlocking the Power of Lists-in-Strings with Softanza 2024
- The Symphony of Repetition: A Coding Journey in Softanza 2024
- Repetition with Elegance: Exploring @N() and @NXT() Smart Builders in Softanza 2024
- Taming Deep Lists with Softanza 2025
- FastProUpdate(): A Semantic Rengineering of RingFastPro extension 2025
- Beyond Loops: The Walker Metaphor in Softanza 2025
- Walking at the Edge — A Naturally-Oriented and Practical Design 2025
- Beyond Inner Loops: Walking on the Second Dimension in Softanza 2025
- The Unified @Find() Function in Softanza 2025
- Named Variables in Softanza: the What, Why and How! 2025
- Safe Access to Haro Hashlists: How Softanza Solves a Common Problem 2025
- DeepContains still reports that "X" exists down inside the nested list 2025
- When “different” is not enough: the story behind Diff(), DiffXT() and DiffXTT() in stzList 2025
The lanes, one by one
Lanes and their notes are quoted as they were read at the source, on Read from the source on 2026-09-16.

