aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/list.ey
blob: 08171fb60db29b4d350166e62d7040e49976b697 (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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<
  [ ] ==:NONE
  0 ==l # placeholder, zero value is never read

  { -102 .len -021 ? }" "#?" defmd
  { .len }" "#len" defmd
  { 0 -01 .len range }" "#dom" defmd
  { [ 0 ] }" _ "#in" deffd "#out" deffd
  { ==m ==l
    l .len {
      l .start l .len 1 sub { 1 -01 * } rep
      m .start 1 -102 =[]
      l .len m .len add l .setLen
    } {
      m .start l .setStart m .len l .setLen
    } ? *
    m .end l .setEnd

    0 m .setLen
    NONE m .setStart
    NONE m .setEnd

    l
    # FIXME think hard whether cat should be destructive
  } "#cat" defmd
  { ==l =*f
    l .start ==n
    l .len { n 2 dearray =n f }" rep
  } "#each" defmd
  { ==l l .len mod ==i
    l .start i { 1 -01 * } rep
    0 -01 *
  } "#*" defmd
  { ==l ==i ==v
    l .len not { "=[] into empty list" die } rep
    l .start i l .len mod { 1 -01 * } rep
    v 0 -102 =[]
  } "#=[]" defmd
  { ==l
    list ==m
    l .len {
      [ 0 NONE ] _ m .setEnd
      l .len 1 sub { [ 0 -102 ] } rep
      m .setStart
      l .len m .setLen
    } { } ? *
    m
  } "#iclone" defmd
  { 0 }" "#istart" deffd
  { .len eq }" "#iend" defmd
  { }" "#itrans" deffd
  { 1 add }" "#istep" deffd

  { =l [ -01 NONE ]
    l .len {
       _ 1 l .end =[]
    }" {
      _ l .setStart
    }" ? *
    l .setEnd
    l .len 1 add l .setLen
  }' /append1 defmd

  { =l
    l .len 2 ge {
      l .start
      l .len _ 1 sub l .setLen
               2 sub { 1 -01 * } rep
      _ l .setEnd
        NONE 1 -102 =[]
    } {
      0 l .setLen
      NONE l .setStart
      NONE l .setEnd
    } ? *
  }' /pop defmd

  { { .append1 }_ '0. * } /append defmd

  { <
    0 ==len { =len }' =*setLen
    NONE ==start { =start }' =*setStart
    NONE ==end { =end }' =*setEnd
  > }'
> -- /list deffd

# vim: syn=elymas