aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/tree.ey
blob: 3d42a42af857c1bccec8e8210978098a58bbd4bf (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<
  < > _ ==:NONE sys .asm .rawAddress ==:NONEADDR
  { sys .asm .rawAddress NONEADDR eq } /isNone deffd
  { -01 .set } "=." deffd

  { [ 0 ] } _ "#in" deffd "#out" deffd

  { dom < =*keys 0 ==i { i 1 add =i } =*step > } "#istart" defmd
  { _ .i -01 .keys } "#itrans" deffd
  { _ .i -01 .|keys len lt not } "#iend" deffd
  { _ .step } "#istep" deffd

  { ==k =*get # ==keyGreater ==keySmaller ==keyEquals ==noNode
    [ 
      { get isNone } { k get .k eq } { k get .k lt } { k get .k gt } -438271605
      { 1 } { "k: " dump k dump "get .k" dump get .k dump "tree key domain broken, key neither smaller, larger nor equal" die }
    ] conds
  } /treeconds deffd

  { ==k ==v =*get =*set
      { v k node set 0 }
      { v get =.v 0 }
      { get .L v k insertAndSplay 4 mul 1 add |set |get splayPath }
      { get .R v k insertAndSplay 4 mul 2 add |set |get splayPath }
    |get k treeconds
  } /insertAndSplay deffd

  { ==k =*get =*set
      { NONE 1 neg }
      { get .v 0 }
      { get .L k findAndSplay 4 mul 1 add |set |get splayPath }
      { get .R k findAndSplay 4 mul 2 add |set |get splayPath }
    |get k treeconds
  } /findAndSplay deffd

  { =*get =*set ==path
    [
      { path  0 lt } { 1 neg } 
      { path  5 eq } { |set |get -1010 right right 0 }
      { path  6 eq } { get .R right |set |get left 0 }
      { path  9 eq } { get .L left |set |get right 0 }
      { path 10 eq } { |set |get -1010 left left 0 }
      { 1 }          { path }
    ] conds
  } /splayPath deffd

  { =*f ==n n isNone not { n .l |f eachNode n f n .r |f eachNode } rep } /eachNode deffd

  { ==t [ t .root { .k } eachNode ] } "#dom" defmd
  { ==t =*f t .root { .v f } eachNode } "#each" defmd

  { .ROOT -1032 insertAndSplay -- } "#=[]" defmd

  { ==tree # ==k
    tree .ROOT -102 findAndSplay ==path # ==v (returned)
    [
      { path 0 eq } { 1 }
      { path 1 eq } { tree .ROOT right 1 }
      { path 2 eq } { tree .ROOT left 1 }
      { 1 } { -- 0 }
    ] conds
  } /fetch deffd

  { fetch not { "unknown key requested" die } rep } "#*" defmd
  { fetch _ { -- -- 1 } rep } /has defmd

  { ==indent ==n
    n isNone {
      "" indent { " " cat } rep sys .err .writeall
      "<none>" dump
    } {
      "" indent { " " cat } rep "k: " cat sys .err .writeall n .k dump
      "" indent { " " cat } rep "v: " cat sys .err .writeall n .v dump
      n .l indent 2 add dumpIndented
      n .r indent 2 add dumpIndented
    } ? *
  } /dumpIndented deffd

  { < ==k ==v NONE _ ==l ==r { = } =*set > } /node deffd

  { _ { =.root }_ -01 { .root }_ } /ROOT defmd
  { _ { =.l }_ -01 { .l }_ } /L defmd
  { _ { =.r }_ -01 { .r }_ } /R defmd

  { * _ .R * _ .L -0*3*41*25* } /left deffd
  { * _ .L * _ .R -0*3*41*25* } /right deffd

  { ==t tree ==n t dom { ==k k t * k n =[] } each n } /clone defmd

  <
    { .root 0 dumpIndented } /dump defmd

    { < { = } =*set NONE ==root > }
  > -- _ "#iclone" deffd
> -- /tree deffd

# longer versions of L+R

#   { =*get =*set
#     get ==p
#     p .r ==x
#     x .l p =.r
#     p x =.l
#     x set
#   } /left deffd
# 
  # { # =*get =*set
  #   * _ .R * _ .L
  #   # p { p =.r } x { x =.l } { x .l }
  #   -0*3*41*25*
  # } /left deffd

#  { =*get =*set
#    get ==p
#    p .l ==x
#    x .r p =.l
#    p x =.r
#    x set
#  } /right deffd

  # { # =*get =*set
  #   * _ .L * _ .R
  #   # p { p =.l } x { x =.r } { x .r }
  #   -0*3*41*25*
  # } /right deffd

# vim: syn=elymas