(fn order-hash [tab order]
  "Provides fixed order iteration over key value table.
;; Example:
;; Give a table an order
(local tab (give-hash-order {:test 11 :rest 12 :best 15} [:rest :test :best]))
;; Insert a new index
(tab:insert :real-big {:y 31})
;; Sort order using an element in table at key
(tab:sort (fn [a b] (> a.y b.y)))
;; Show that they are now ordered
(each [key value (tab:iter)] (print key))
;; Give it an arbitrary order
(tab:update [:real-big :rest :best :test])"
  (fn iter [oi]
    (var i 0)
    (local {:__order order} (getmetatable tab))
    (fn []
      (set i (+ i 1))
      (when (<= i (# order))
        (values (. order i) (. oi (. order i))))))
  (fn update [oi order]
    (local metatable (getmetatable tab))
    (tset metatable :__order order)
    oi)
  (fn insert [oi key value]
    (local {:__order order} (getmetatable tab))
    (table.insert oi key value)
    (table.insert order key)
    oi)
  (fn sort [oi fun]
    (local {:__order order} (getmetatable tab))
    (table.sort order (fn [a b] (fun (. oi a) (. oi b))))
    oi)
  (setmetatable tab
                {:__index {: iter
                           : update
                           : insert
                           : sort}
                 :__order order}))

Generated by alexjgriffith using scpaste at Mon Aug 25 21:48:02 2025. EDT. (original)