haskell: Phase 11 — Data.Map core operations (singleton/insert/lookup/delete/member/null)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 1m45s

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-07 09:02:47 +00:00
parent a29bb6feca
commit 180b9009bf
2 changed files with 152 additions and 1 deletions

View File

@@ -132,3 +132,145 @@
(hk-map-single-r k v l r))
(:else (hk-map-double-r k v l r)))))
(:else (hk-map-node k v l r))))))
(define
hk-map-singleton
(fn (k v) (hk-map-node k v hk-map-empty hk-map-empty)))
(define
hk-map-insert
(fn
(k v m)
(cond
((hk-map-empty? m) (hk-map-singleton k v))
(:else
(let
((mk (hk-map-key m)))
(cond
((< k mk)
(hk-map-balance
mk
(hk-map-val m)
(hk-map-insert k v (hk-map-left m))
(hk-map-right m)))
((> k mk)
(hk-map-balance
mk
(hk-map-val m)
(hk-map-left m)
(hk-map-insert k v (hk-map-right m))))
(:else (hk-map-node k v (hk-map-left m) (hk-map-right m)))))))))
(define
hk-map-lookup
(fn
(k m)
(cond
((hk-map-empty? m) (list "Nothing"))
(:else
(let
((mk (hk-map-key m)))
(cond
((< k mk) (hk-map-lookup k (hk-map-left m)))
((> k mk) (hk-map-lookup k (hk-map-right m)))
(:else (list "Just" (hk-map-val m)))))))))
(define
hk-map-member
(fn
(k m)
(cond
((hk-map-empty? m) false)
(:else
(let
((mk (hk-map-key m)))
(cond
((< k mk) (hk-map-member k (hk-map-left m)))
((> k mk) (hk-map-member k (hk-map-right m)))
(:else true)))))))
(define hk-map-null hk-map-empty?)
(define
hk-map-find-min
(fn
(m)
(cond
((hk-map-empty? (hk-map-left m))
(list (hk-map-key m) (hk-map-val m)))
(:else (hk-map-find-min (hk-map-left m))))))
(define
hk-map-delete-min
(fn
(m)
(cond
((hk-map-empty? (hk-map-left m)) (hk-map-right m))
(:else
(hk-map-balance
(hk-map-key m)
(hk-map-val m)
(hk-map-delete-min (hk-map-left m))
(hk-map-right m))))))
(define
hk-map-find-max
(fn
(m)
(cond
((hk-map-empty? (hk-map-right m))
(list (hk-map-key m) (hk-map-val m)))
(:else (hk-map-find-max (hk-map-right m))))))
(define
hk-map-delete-max
(fn
(m)
(cond
((hk-map-empty? (hk-map-right m)) (hk-map-left m))
(:else
(hk-map-balance
(hk-map-key m)
(hk-map-val m)
(hk-map-left m)
(hk-map-delete-max (hk-map-right m)))))))
(define
hk-map-glue
(fn
(l r)
(cond
((hk-map-empty? l) r)
((hk-map-empty? r) l)
((> (hk-map-size l) (hk-map-size r))
(let
((mp (hk-map-find-max l)))
(hk-map-balance (first mp) (nth mp 1) (hk-map-delete-max l) r)))
(:else
(let
((mp (hk-map-find-min r)))
(hk-map-balance (first mp) (nth mp 1) l (hk-map-delete-min r)))))))
(define
hk-map-delete
(fn
(k m)
(cond
((hk-map-empty? m) m)
(:else
(let
((mk (hk-map-key m)))
(cond
((< k mk)
(hk-map-balance
mk
(hk-map-val m)
(hk-map-delete k (hk-map-left m))
(hk-map-right m)))
((> k mk)
(hk-map-balance
mk
(hk-map-val m)
(hk-map-left m)
(hk-map-delete k (hk-map-right m))))
(:else (hk-map-glue (hk-map-left m) (hk-map-right m)))))))))

View File

@@ -182,7 +182,7 @@ No OCaml changes are needed. The view type is fully representable as an SX dict.
- [x] Implement a weight-balanced BST in pure SX in `lib/haskell/map.sx`.
Internal node representation: `("Map-Node" key val left right size)`.
Leaf: `("Map-Empty")`.
- [ ] Core operations: `empty`, `singleton`, `insert`, `lookup`, `delete`,
- [x] Core operations: `empty`, `singleton`, `insert`, `lookup`, `delete`,
`member`, `size`, `null`.
- [ ] Bulk operations: `fromList`, `toList`, `toAscList`, `keys`, `elems`.
- [ ] Combining: `unionWith`, `intersectionWith`, `difference`.
@@ -304,6 +304,15 @@ No OCaml changes are needed. The view type is fully representable as an SX dict.
_Newest first._
**2026-05-07** — Phase 11 core operations on `Data.Map` BST:
- Added `hk-map-singleton`, `hk-map-insert`, `hk-map-lookup`, `hk-map-delete`,
`hk-map-member`, `hk-map-null`. Insert recurses with `hk-map-balance` to
maintain weight invariants. Lookup returns `("Just" v)` / `("Nothing")` —
matches Haskell ADT layout. Delete uses a `hk-map-glue` helper that picks
the larger subtree and pulls its extreme element to the root, preserving
balance without imperative state. Spot-checked: insert+lookup hit/miss,
member, delete root with successor pulled from right.
**2026-05-07** — Phase 11 BST skeleton in `lib/haskell/map.sx`:
- Adams-style weight-balanced tree: node = `("Map-Node" k v l r size)`,
empty = `("Map-Empty")`. delta=3 / gamma=2 ratios. Implemented constructors