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
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:
@@ -132,3 +132,145 @@
|
|||||||
(hk-map-single-r k v l r))
|
(hk-map-single-r k v l r))
|
||||||
(:else (hk-map-double-r k v l r)))))
|
(:else (hk-map-double-r k v l r)))))
|
||||||
(:else (hk-map-node 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)))))))))
|
||||||
|
|||||||
@@ -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`.
|
- [x] Implement a weight-balanced BST in pure SX in `lib/haskell/map.sx`.
|
||||||
Internal node representation: `("Map-Node" key val left right size)`.
|
Internal node representation: `("Map-Node" key val left right size)`.
|
||||||
Leaf: `("Map-Empty")`.
|
Leaf: `("Map-Empty")`.
|
||||||
- [ ] Core operations: `empty`, `singleton`, `insert`, `lookup`, `delete`,
|
- [x] Core operations: `empty`, `singleton`, `insert`, `lookup`, `delete`,
|
||||||
`member`, `size`, `null`.
|
`member`, `size`, `null`.
|
||||||
- [ ] Bulk operations: `fromList`, `toList`, `toAscList`, `keys`, `elems`.
|
- [ ] Bulk operations: `fromList`, `toList`, `toAscList`, `keys`, `elems`.
|
||||||
- [ ] Combining: `unionWith`, `intersectionWith`, `difference`.
|
- [ ] 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._
|
_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`:
|
**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)`,
|
- Adams-style weight-balanced tree: node = `("Map-Node" k v l r size)`,
|
||||||
empty = `("Map-Empty")`. delta=3 / gamma=2 ratios. Implemented constructors
|
empty = `("Map-Empty")`. delta=3 / gamma=2 ratios. Implemented constructors
|
||||||
|
|||||||
Reference in New Issue
Block a user