aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ordered.shared.moon
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ordered.shared.moon')
-rw-r--r--lib/ordered.shared.moon27
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/ordered.shared.moon b/lib/ordered.shared.moon
new file mode 100644
index 0000000..59c07bf
--- /dev/null
+++ b/lib/ordered.shared.moon
@@ -0,0 +1,27 @@
+-- ordered table iterator, for stable(r) renderers
+
+sort = (t, order_fn) ->
+ with index = [k for k,v in pairs t when 'string' == type k]
+ table.sort index, order_fn
+
+-- ordered next(t)
+onext = (state, key) ->
+ state.i += 1
+ { :t, :index, :i } = state
+
+ if key = index[i]
+ key, t[key]
+
+-- ordered pairs(t). order_fn is optional; see table.sort
+opairs = (t, order_fn) ->
+ state = {
+ :t,
+ i: 0,
+ index: sort t, order_fn
+ }
+ onext, state, nil
+
+{
+ :onext
+ :opairs
+}