Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
287 commits
Select commit Hold shift + click to select a range
783add6
doc-tweaks
danlentz Feb 12, 2026
e42451e
new: add-if-absent
danlentz Feb 12, 2026
69bd237
update api docs
danlentz Feb 12, 2026
6646a98
cleanups
danlentz Feb 13, 2026
cea4ecf
zorp example updated
danlentz Feb 14, 2026
3d22c8d
updated ops
danlentz Feb 14, 2026
96a16ae
cookbook examples updated
danlentz Feb 14, 2026
5014d31
updated
danlentz Feb 14, 2026
26a8178
updated
danlentz Feb 14, 2026
a3ad549
update api docs
danlentz Feb 14, 2026
4068da7
speculative
danlentz Feb 14, 2026
cd1d40e
updated
danlentz Feb 14, 2026
e9bbebf
cleanup
danlentz Feb 14, 2026
430b0fb
refactor
danlentz Feb 14, 2026
a00e474
pred/succ
danlentz Feb 14, 2026
bb909fc
subset?/superset?
danlentz Feb 14, 2026
03b1ea9
quick start
danlentz Feb 15, 2026
8171559
range-map benchmarks and guava equivalence tests
danlentz Feb 15, 2026
e3d2cfc
refine priority queue api
danlentz Feb 15, 2026
edec308
danlentz Feb 15, 2026
32638de
PPriorityQueue Protocol
danlentz Feb 15, 2026
317332d
protocol abstractions
danlentz Feb 15, 2026
149294e
update intro
danlentz Feb 16, 2026
9ef1f71
start a discussion
danlentz Feb 16, 2026
35799d0
lost track
danlentz Feb 16, 2026
6b16219
nuf said
danlentz Feb 16, 2026
6be5ad6
note about parallelism
danlentz Feb 16, 2026
7275fb3
update api docs
danlentz Feb 16, 2026
ef10d73
update references
danlentz Feb 16, 2026
93f7ba0
faster
danlentz Feb 16, 2026
c28b3ec
bench
danlentz Feb 16, 2026
800fe4c
optimized fold
danlentz Feb 16, 2026
144055f
Update documentation with verified Criterium N=500K benchmark results
danlentz Feb 16, 2026
a93e4ed
Remove unnecessary dynamic binding from nth - 8x speedup
danlentz Feb 16, 2026
e29ee91
updated benchmarks
danlentz Feb 16, 2026
9dd3871
cleanup
danlentz Feb 16, 2026
a6269e4
new bench infra
danlentz Feb 16, 2026
2446f3a
refactor nth/PRanked
danlentz Feb 16, 2026
3a55431
doc updates
danlentz Feb 16, 2026
d030f0a
interop/prtotocol reorg
danlentz Feb 16, 2026
43f7792
refactor
danlentz Feb 16, 2026
3439420
update docs
danlentz Feb 16, 2026
3fc8fa0
bench refactor
danlentz Feb 16, 2026
8db6120
bench infra refactor
danlentz Feb 16, 2026
468c8f4
bugfix
danlentz Feb 16, 2026
2592447
new: interval-tree-tests
danlentz Feb 16, 2026
732f7b7
remove memory notifications
danlentz Feb 16, 2026
2315e42
protocol updates
danlentz Feb 16, 2026
44ce928
reorganized
danlentz Mar 2, 2026
136d465
new: disjoint?
danlentz Mar 2, 2026
bdad241
data readers
danlentz Mar 2, 2026
a78719a
disjoint
danlentz Mar 2, 2026
cd0ecdf
diagram not really needed
danlentz Mar 13, 2026
26a05f8
update ns in examples
danlentz Mar 13, 2026
f4f7820
reader macros
danlentz Mar 13, 2026
276f6d0
ws
danlentz Mar 13, 2026
cafe9ce
refine memory bench fixture
danlentz Mar 13, 2026
477507e
tagged literal tests
danlentz Mar 13, 2026
12b64a3
new: default-comparator?
danlentz Mar 13, 2026
2b41d97
doc-fix: pq
danlentz Mar 13, 2026
a216632
literal representation
danlentz Mar 13, 2026
211f518
added
danlentz Mar 14, 2026
2a35b3a
demote to snapshot (for now)
danlentz Mar 14, 2026
39d1f84
ps -> pdf
danlentz Mar 14, 2026
e17b2bd
include references
danlentz Mar 14, 2026
626ee38
adjust parallelism threshold
danlentz Mar 14, 2026
ea9d804
quicker criterium bench
danlentz Mar 14, 2026
fd4b89f
update benchmarks
danlentz Mar 14, 2026
1574b9f
updated
danlentz Mar 14, 2026
0420e9b
updated
danlentz Mar 14, 2026
37c32ac
retired
danlentz Mar 14, 2026
255b436
correct arg order
danlentz Mar 14, 2026
daef86e
updated
danlentz Mar 14, 2026
0504dc7
update api docs
danlentz Mar 14, 2026
3d79e8d
updated
danlentz Mar 14, 2026
c8e43ef
updated
danlentz Mar 14, 2026
cb099b1
updated
danlentz Mar 14, 2026
a870c2e
updated
danlentz Mar 14, 2026
5e30032
updated
danlentz Mar 14, 2026
cc0c9f8
updated
danlentz Mar 14, 2026
19e1994
added
danlentz Mar 14, 2026
732b9de
updated
danlentz Mar 14, 2026
e1c0887
added
danlentz Mar 14, 2026
f072b15
upd: quick start intro
danlentz Mar 14, 2026
38d973e
fork-join -> parallel
danlentz Mar 14, 2026
44e21b9
updated
danlentz Mar 14, 2026
9e1866b
improve hash/equality semantics
danlentz Mar 14, 2026
c216bca
impl: toString
danlentz Mar 14, 2026
52952e8
impl: headset, tailset
danlentz Mar 14, 2026
8cf99d5
fix: compare/equiv
danlentz Mar 14, 2026
5702cc5
node-map-merge: fork-join
danlentz Mar 14, 2026
ae8f312
re-home ordered-merge-with
danlentz Mar 14, 2026
0f4e136
alias/re-exporting
danlentz Mar 14, 2026
4ad457e
promote protocol, util ns
danlentz Mar 14, 2026
d05edba
re-org
danlentz Mar 14, 2026
1ef2ead
de-cruft
danlentz Mar 14, 2026
4dd5e1c
fix: node-map-compare
danlentz Mar 14, 2026
41dbe8b
created
danlentz Mar 14, 2026
79048fc
rank-of -> rank
danlentz Mar 14, 2026
0932dfb
pq naming
danlentz Mar 14, 2026
d0bc4ba
fix: span
danlentz Mar 14, 2026
2dc8d24
pq api rename
danlentz Mar 14, 2026
0e64233
test: disjoint
danlentz Mar 14, 2026
d83c802
test: merge-withs
danlentz Mar 14, 2026
ec950fd
new: serializable
danlentz Mar 15, 2026
6a613e7
0-arity constructors
danlentz Mar 15, 2026
9d64b77
docstrings: interval map/set
danlentz Mar 15, 2026
da2b284
resolve ordered-map constructor ambiguity
danlentz Mar 15, 2026
39f2694
refactor: span
danlentz Mar 15, 2026
a341ef0
refactor: reduce
danlentz Mar 15, 2026
9dd16aa
added: Reversible
danlentz Mar 15, 2026
9b87e20
impl: reduce
danlentz Mar 15, 2026
8ade5bc
impl: disjoint?
danlentz Mar 15, 2026
6f055f2
optimization: reduce number of closures per call
danlentz Mar 15, 2026
220ac68
updated rank example
danlentz Mar 15, 2026
cc6b26e
improve forkjoin
danlentz Mar 15, 2026
a957385
updated
danlentz Mar 15, 2026
b2deac5
doc: fork-join
danlentz Mar 15, 2026
fa9f03b
update benchmarks
danlentz Mar 15, 2026
c2d156e
fix: print-method
danlentz Mar 15, 2026
392d0c1
fully implement java.util.sortedmap
danlentz Mar 15, 2026
110abeb
refactor: chunked-fold
danlentz Mar 16, 2026
63ac7e8
bench updates
danlentz Apr 2, 2026
5658fe9
segment-tree: harden implementation
danlentz Apr 2, 2026
7456857
cleanup
danlentz Apr 2, 2026
a09203c
set-algebra: reduce dynamic binding overhead
danlentz Apr 2, 2026
206f9ec
re-architect fork-join strategy
danlentz Apr 3, 2026
e01b0b2
vs. hash-set ops
danlentz Apr 3, 2026
f3ee042
clarify: “last”
danlentz Apr 3, 2026
72faf3c
note about representational polymorphism
danlentz Apr 3, 2026
b068996
fold bench
danlentz Apr 3, 2026
aa5829d
renaming: direct-seq -> node-direct-seq
danlentz Apr 3, 2026
8671582
delete api doc artifacts
danlentz Apr 3, 2026
bef6cdc
notes
danlentz Apr 3, 2026
2b63b6f
priority-queue hardening
danlentz Apr 3, 2026
d3b8a0e
reformat perf table
danlentz Apr 3, 2026
526e313
reformat set algebra tables
danlentz Apr 3, 2026
8b9e05d
cleanup
danlentz Apr 3, 2026
966d761
test/bench refactor
danlentz Apr 3, 2026
ae40ee4
deleted: when-to-use.md
danlentz Apr 3, 2026
129da3c
cookbook examples updated
danlentz Apr 3, 2026
75a08f4
:scope “provided”
danlentz Apr 3, 2026
a586b40
doc cleanup
danlentz Apr 3, 2026
bd62e43
decruft
danlentz Apr 3, 2026
a7eeaa5
doc cleanups
danlentz Apr 3, 2026
799dba8
cleanup
danlentz Apr 3, 2026
b20e056
danlentz Apr 3, 2026
fe8ddaa
tweak
danlentz Apr 3, 2026
5afd083
improve CI workflow
danlentz Apr 3, 2026
79a93b2
fix: dep cache
danlentz Apr 3, 2026
b9cf2a2
tree-health property testing
danlentz Apr 3, 2026
8b7c9cb
fix URLs of referencess
danlentz Apr 3, 2026
1bdfa54
improve docs
danlentz Apr 3, 2026
dfe0003
node-stitch cleanup; helper cleanups
danlentz Apr 4, 2026
fed9284
docstring
danlentz Apr 4, 2026
12fd3f4
Tree Search: cleanup/refactor
danlentz Apr 4, 2026
8b40e7d
refactor: reduction
danlentz Apr 4, 2026
464294e
new: collections-api.md
danlentz Apr 4, 2026
ad473dc
refactor: node-compare / equality
danlentz Apr 4, 2026
7065297
update benchmarks
danlentz Apr 4, 2026
3521a90
rename: com.dean.ordered-collections -> ordered-collections
danlentz Apr 4, 2026
0b2df90
refactor: fold
danlentz Apr 4, 2026
a79fb99
ws
danlentz Apr 4, 2026
32b8177
update description
danlentz Apr 4, 2026
6ae8c53
improve benchmark artifacts
danlentz Apr 4, 2026
55f81d5
update benchmarks
danlentz Apr 5, 2026
0f3cf7e
collectioj `type` cleanup
danlentz Apr 5, 2026
497f609
refreshed
danlentz Apr 5, 2026
4d09046
new: benchmarks report
danlentz Apr 5, 2026
bec09de
take 2
danlentz Apr 5, 2026
bf6295f
nvm
danlentz Apr 5, 2026
f9d7395
literal-tags: ordered/ -> oc/
danlentz Apr 5, 2026
e6d45a5
revert tag to #ordered
danlentz Apr 5, 2026
b0a3cbc
new: general-compare
danlentz Apr 5, 2026
0e928ed
cleanup
danlentz Apr 5, 2026
8043479
refactor: general-compare
danlentz Apr 5, 2026
39f306c
simple project “stats” script
danlentz Apr 5, 2026
a960437
updates
danlentz Apr 5, 2026
69f7a6f
per-collection-notes
danlentz Apr 5, 2026
d239d77
created
danlentz Apr 5, 2026
01855e7
refactor pq
danlentz Apr 5, 2026
356416d
imprived seq/equiv
danlentz Apr 5, 2026
674e721
refactor: ordered-multiset
danlentz Apr 5, 2026
89b3dd3
refactor: fuzzies
danlentz Apr 5, 2026
863f8c4
experimental: ropes
danlentz Apr 5, 2026
86cebf0
refactor: segment-tree
danlentz Apr 5, 2026
767469b
rope updates
danlentz Apr 5, 2026
5d5a476
refactor: range-map
danlentz Apr 5, 2026
2e487c6
further refactoring
danlentz Apr 6, 2026
39c3b95
promote: ropes
danlentz Apr 6, 2026
db578b8
tagged literal
danlentz Apr 6, 2026
bebe772
danlentz Apr 6, 2026
8ee1b44
Document Editor Buffer example
danlentz Apr 6, 2026
f0661f1
rope refinements
danlentz Apr 6, 2026
cc9e855
rope tuning
danlentz Apr 6, 2026
c371ae4
created
danlentz Apr 6, 2026
d0b1c27
rope benchmarks/tuning
danlentz Apr 6, 2026
e47992f
tweak the title
danlentz Apr 6, 2026
8291105
new: lein paper generate pdf
danlentz Apr 6, 2026
28b3e0a
refactor: PRope
danlentz Apr 6, 2026
b3359db
cleanup
danlentz Apr 6, 2026
08b1a2a
ordered-collections.tree -> ordered-collections.kernel
danlentz Apr 6, 2026
13e6e49
fix: Duplicate interval keys in the test data
danlentz Apr 6, 2026
afffaab
impl: IPersistentVector, RandomAccess
danlentz Apr 6, 2026
65a03ce
cleanup
danlentz Apr 6, 2026
0ec0b65
fix/optimize unboxed node collections
danlentz Apr 6, 2026
31ce166
refactor: rope
danlentz Apr 6, 2026
943509a
ropes optimizations
danlentz Apr 6, 2026
aca786f
improved ropes doc
danlentz Apr 6, 2026
c792aac
modest improvement to fold
danlentz Apr 6, 2026
d9a403e
bench: rope-fold
danlentz Apr 6, 2026
081a0a8
danlentz Apr 6, 2026
b165933
strengthen testing
danlentz Apr 6, 2026
6b33e9d
doc: TransientRope
danlentz Apr 7, 2026
b853b48
Transient rope refactor
danlentz Apr 7, 2026
74a0202
new: bench-transient-rope
danlentz Apr 7, 2026
3442116
improved: rope-equiv
danlentz Apr 7, 2026
ddf25dd
clarification
danlentz Apr 7, 2026
98c78b9
experimental: improve graphics
danlentz Apr 8, 2026
7bb853a
try floating the logo left
danlentz Apr 8, 2026
07bb516
try again
danlentz Apr 8, 2026
db3eb86
danlentz Apr 8, 2026
bbc3323
fix: bottom border
danlentz Apr 8, 2026
a3aab69
danlentz Apr 8, 2026
457a96b
try a table
danlentz Apr 8, 2026
834ca8b
remove borders
danlentz Apr 8, 2026
187929b
try white borders
danlentz Apr 8, 2026
7b89b04
tweak
danlentz Apr 8, 2026
339a58a
bench report; improve repo automation
danlentz Apr 8, 2026
7b49c98
updates/corrections
danlentz Apr 8, 2026
131019f
optimize: equiv
danlentz Apr 8, 2026
3364a9c
rope benchmarks
danlentz Apr 8, 2026
e64f824
tooling notes
danlentz Apr 8, 2026
6eb96a9
declutter the quickstart
danlentz Apr 8, 2026
54214d6
rope bench
danlentz Apr 8, 2026
663144f
rope bench
danlentz Apr 8, 2026
6c9d05e
refactor etc/ tools
danlentz Apr 8, 2026
a449a6c
refactor script names
danlentz Apr 8, 2026
06a4e9f
bench: rope fold
danlentz Apr 8, 2026
416489b
improve ropes examples
danlentz Apr 8, 2026
485d0c9
rope api updates
danlentz Apr 8, 2026
9055339
ws
danlentz Apr 8, 2026
b0a33d6
ropes are the topline feature
danlentz Apr 8, 2026
9e3e9db
ws
danlentz Apr 8, 2026
0858cf5
update rope example
danlentz Apr 8, 2026
b6a4de0
1-arity rope-concat
danlentz Apr 8, 2026
ed9e7c7
refine tagline
danlentz Apr 8, 2026
036fcb2
fix: tagline
danlentz Apr 8, 2026
87d9379
bump version
danlentz Apr 8, 2026
1210aeb
ws
danlentz Apr 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 51 additions & 9 deletions .github/workflows/clojure.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,60 @@ name: Clojure CI

on:
push:
branches: [ master ]
branches: ["*"]
pull_request:
branches: [ master ]
branches: ["master"]

jobs:
build:
permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: Test
runs-on: ubuntu-latest
timeout-minutes: 30

steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: lein deps
- name: Run tests
run: lein test
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "25.0.2"

- name: Install Clojure tooling
uses: DeLaGuardo/setup-clojure@13.5.2
with:
cli: latest
lein: latest
bb: latest

- name: Cache Clojure dependencies
uses: actions/cache@v4
with:
path: |
~/.m2/repository
~/.gitlibs
~/.lein
key: ${{ runner.os }}-clojure-${{ hashFiles('project.clj', 'deps.edn') }}
restore-keys: |
${{ runner.os }}-clojure-

- name: Show tool versions
run: |
java --version
clojure -Sdescribe
lein version
bb --version

- name: Run Leiningen tests
run: lein test

- name: Run tools.deps tests
run: clojure -M:test
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
/target
/classes
/checkouts
/plans
pom.xml
pom.xml.asc
*.jar
*.class
/.lein-*
/.nrepl-port
*~
# Benchmark results (local records)
/bench-results/
/doc/api/

# Claude Code
/.claude/
.DS_Store
/.cpcache
/AGENTS.md
113 changes: 113 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# Changelog

## [0.2.0] - 2026-04-08

### New Collection Types

- **Rope** (`rope`) — persistent chunked sequence for O(log n) structural editing
(concat, split, splice, insert, remove). Backed by a weight-balanced tree of
chunk vectors with a formal Chunk Size Invariant. Up to 1968x faster than
`PersistentVector` on repeated random edits at 500K elements; 3-10x faster
on concatenation; 1.3-1.7x faster on reduce at scale. Includes
structure-sharing subrange views via `rope-sub`, transient support for batch construction,
parallel `r/fold`, `java.util.List` interop, and lexicographic `Comparable`.
- **Range Map** (`range-map`) — non-overlapping `[lo, hi)` ranges with automatic carve-out on insert
- **Segment Tree** (`segment-tree`, `sum-tree`, `min-tree`, `max-tree`) — O(log n) range aggregation with any associative operation
- **Priority Queue** (`priority-queue`) — O(log n) push/peek/pop with min and max access
- **Ordered Multiset** (`ordered-multiset`) — sorted bag allowing duplicate elements
- **Fuzzy Set/Map** (`fuzzy-set`, `fuzzy-map`) — nearest-neighbor lookup by distance with configurable tiebreaking

### New Operations

- **Set algebra**: `union`, `intersection`, `difference`, `subset?`, `superset?`, `disjoint?`
- **Positional**: `rank`, `slice`, `median`, `percentile`
- **Navigation**: `nearest` (floor/ceiling with keyword tests `:<=`, `:>=`, `:<`, `:>`), `subrange`, `split-key`, `split-at`
- **Interval**: `overlapping`, `span`
- **Range map**: `ranges`, `span`, `gaps`, `assoc-coalescing`, `get-entry`, `range-remove`
- **Segment tree**: `query`, `aggregate`, `update-val`, `update-fn`
- **Priority queue**: `push`, `push-all`, `peek-min`, `peek-min-val`, `pop-min`, `peek-max`, `peek-max-val`, `pop-max`
- **Multiset**: `multiplicity`, `disj-one`, `disj-all`, `distinct-elements`, `element-frequencies`
- **Fuzzy**: `fuzzy-nearest`, `fuzzy-exact-contains?`, `fuzzy-exact-get`
- **Rope**: `rope-concat`, `rope-concat-all`, `rope-split`, `rope-sub`, `rope-insert`, `rope-remove`, `rope-splice`, `rope-chunks`, `rope-chunks-reverse`, `rope-chunk-count`, `rope-str`
- **Map**: `assoc-new`, `ordered-merge-with`
- **Comparator**: `general-compare` — opt-in total order over all values including non-Comparable types (Namespace, Var, etc.). ~20% slower lookups on Comparable types vs default.

### Specialized Constructors

- Rope: `rope`
- Type-specific: `long-ordered-set`, `long-ordered-map`, `double-ordered-set`, `double-ordered-map`, `string-ordered-set`, `string-ordered-map`
- Custom comparator: `ordered-set-by`, `ordered-map-by`, `ordered-set-with`, `ordered-map-with`, `ordered-multiset-by`, `fuzzy-set-by`, `fuzzy-map-by`, `segment-tree-by`, `segment-tree-with`
- Exported comparators: `long-compare`, `double-compare`, `string-compare`, `general-compare`, `compare-by`

### Interface Implementations

- `clojure.lang.Sorted` — native `subseq`/`rsubseq` on ordered-set and ordered-map
- `clojure.core.reducers/CollFold` — chunked parallel fold; ordered-set/map, rope, and compatible tree-backed types split into larger chunks before delegating to `r/fold`
- `clojure.lang.IEditableCollection` / `ITransientCollection` — transient support for `Rope` with mutable tail buffer for efficient batch construction
- `clojure.core.protocols/CollReduce` — implemented directly on all collection deftypes for correct fast-path reduction
- `clojure.lang.IHashEq` — correct `hash` for use in hash-based collections
- `java.io.Serializable` — Java serialization support
- `IReduceInit`/`IReduce` — direct tree traversal for fast `reduce`
- Direct `ISeq` implementations (`KeySeq`, `EntrySeq`) replace lazy-seq wrappers

### EDN Tagged Literals

Round-trip serialization via `data_readers.clj`: `#ordered/set`, `#ordered/map`, `#ordered/interval-set`, `#ordered/interval-map`, `#ordered/range-map`, `#ordered/priority-queue`, `#ordered/multiset`, `#ordered/rope`. Collections with custom comparators (including `general-compare`) print in opaque `#<Type ...>` form to avoid non-round-trippable tagged literals.

### Performance

- **Parallel set operations** via ForkJoinPool with operation-specific root thresholds (`65,536–131,072`), `65,536` recursive thresholds, and `64` sequential cutoff
- **Primitive node types** (`LongKeyNode`, `DoubleKeyNode`) — unboxed key storage
- **Primitive lookup fast path** — `long-ordered-set` bypasses `Comparator` dispatch
- **Interval overlap** — `intersects?` reduced from up to 12 comparisons to 2 (closed-interval identity: `a0 <= b1 AND a1 <= b0`)
- **Reduction refactor** — unary reducers (nodes, keys, entries) share a single enumerator-based kernel; kv reducers remain separate to avoid packing overhead. All support `reduced` short-circuiting.
- Fold benchmarking includes a non-trivial frequency-map workload comparing `ordered-set` fold against `hash-set` reduce, `sorted-set` fold/reduce, and `data.avl` fold/reduce
- Benchmark/test infrastructure shares common workload generators, reference helpers, and competitor builders via `test-utils` and `bench-utils`

See [benchmarks](doc/benchmarks.md) for current numbers and analysis.

### Build

- Namespace root is now `ordered-collections.*` / `ordered_collections.*` rather than `com.dean.ordered-collections.*`
- Source/test tree lives under `src/ordered_collections` and `test/ordered_collections`
- `lein stats` — babashka-based project statistics report (clj-kondo analysis, git churn, codebase metrics)

### Bug Fixes

- `SortedSet.tailSet` now returns elements >= x (was exclusive)
- `SortedSet.subSet` now returns elements >= from, < to
- Interval tree construction uses sequential reduce (parallel fold lost dynamic binding for node allocator at >2048 elements)
- `segment-tree` range queries are generic over ordered keys rather than assuming integer-only query bounds
- `general-compare` collections print opaque (`#<OrderedSet ...>`) rather than emitting tagged literals that cannot round-trip through EDN
- Priority queue uses direct seq adapters instead of lazy `map` wrappers; stronger coverage for duplicate-priority ordering and boundary cases

### Documentation

- New [Ropes](doc/ropes.md) — rope tutorial, use cases, and design
- New [Collections API](doc/collections-api.md) — per-type constructor and operation reference
- [Migration guide](doc/vs-clojure-data-avl.md) corrected (`oc/rank` not `oc/rank-of`)
- Performance documentation consolidated in `doc/benchmarks.md`; the older `perf-analysis.md` and `when-to-use.md` are removed
- Cookbook examples refreshed for current semantics
- Generated `doc/api` output is no longer tracked in the repository

### Breaking Changes

- **Removed** `mutable-ordered-set`, `mutable-ordered-map`, `mutable-interval-set`, `mutable-interval-map`
- **Removed** `transient`/`persistent!` support (path-copying made it a no-op)
- **Renamed** public function: `rank-of` → `rank` (returns `nil` instead of `-1` for missing elements)
- Public namespace root and Maven/Lein artifact coordinate are now `ordered-collections`

---

## [0.1.2] - 2024

- Documentation improvements
- Minor bug fixes

## [0.1.1] - 2024

- Initial public release
- Weight-balanced persistent binary trees
- `ordered-set`, `ordered-map`, `interval-set`, `interval-map`
- Efficient set operations (intersection, union, difference)
- `nth` and `indexOf` in O(log n) time
Loading
Loading