(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}))