aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ordered.shared.moon
blob: 59c07bfe053842625912e4100d8be9661da00ef0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
}