aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ordered.moon
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2018-10-30 02:41:14 +0000
committers-ol <s-ol@users.noreply.github.com>2018-10-30 02:41:14 +0000
commit3b02770e7f9ec14487493c68ff12ec42e0f2755b (patch)
tree45c8d7d8ef4c813634321f280146e8ddad9c333e /lib/ordered.moon
parentupdate interp docs (diff)
downloadmmm-3b02770e7f9ec14487493c68ff12ec42e0f2755b.tar.gz
mmm-3b02770e7f9ec14487493c68ff12ec42e0f2755b.zip
reorganize lib
Diffstat (limited to 'lib/ordered.moon')
-rw-r--r--lib/ordered.moon27
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/ordered.moon b/lib/ordered.moon
new file mode 100644
index 0000000..59c07bf
--- /dev/null
+++ b/lib/ordered.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
+}