Which versions remain available
An ordinary mutable update replaces previous state. A persistent update produces a new version while preserving access to earlier ones. Partial persistence permits queries on old versions but updates only the newest; full persistence permits updates from any existing version.
Updating an earlier version creates another version rather than overwriting it. Driscoll and colleagues’ 1989 paper systematically studied ways to add persistence to linked structures.
References: [1]
Different costs of retaining history
Retaining versions need not copy an entire tree after every update. Path copying duplicates changed nodes and their ancestors, creates a new root, and shares unaffected branches.
Another approach records version-stamped field changes within nodes. Costs depend on the underlying structure: the number of copied ancestors and the effort to find a historical field value are separate concerns.
Efficient construction and retained history
Old roots can keep shared nodes alive, so retaining history still costs memory. Persistence alone does not imply disk durability or a complete transaction system.
Clojure additionally supports transient construction before producing a persistent result. A transient must remain under single-threaded control and cannot be used after conversion back; this optimization has explicit ownership limits.