1    type StringBuilder =
2        let list = List<Char>.new
3    
4        fun get (i : u32) = list[i]
5    
6        def length = list.size
7        def is_empty = list.is_empty
8        def is_not_empty = list.is_not_empty
9    
10       def append (c : Char) = list.add c
11       def insert (i : u32) (c : Char) = list.add i c
12   
13       def append (s : String) =
14           list.provision (list.size + s.length)
15           for i = 0 until s.length do
16               let c = s[i]
17               if c <> '\r' then
18                   list.add c
19               else if i + 1 < s.length && s[i + 1] <> '\n' then
20                   list.add '\n'
21   
22       def append @secondary (s : CString) =
23           let length =
24               let mut index = 0
25               while s[index] <> '\0' do
26                   index += 1
27   
28               index
29   
30           list.provision (list.size + length)
31           for i = 0 until length do
32               let c = s[i]
33               if c <> '\r' then
34                   list.add c.as<Char>
35               else if i + 1 < s.length && s[i + 1] <> '\n' then
36                   list.add '\n'
37   
38       def insert (i : u32) (s : String) =
39           list.provision (list.size + s.length)
40           let l = s.length
41   
42           for j = l - 1 downto 0 do
43               list[j + i + l] = list[j + j]
44   
45           for j = 0 until l do
46               list[j + i] = s[j]
47   
48       def pop =
49           list.remove_last
50   
51       def remove_at (i : u32) =
52           list.remove_at i
53   
54       def remove_at @secondary (i : i32) =
55           list.remove_at i
56   
57       def remove_range (start : u32) (end : u32) : Unit =
58           fail
59   
60       def replace_range (start : u32
61                          end : u32
62                          s : String) : Unit =
63           fail
64   
65       def clear =
66           list.clear
67   
68       def as_string = String list.as_ptr list.size
69   
70       def create =
71           let ptr = kedr/alloc<Char> list.size
72           for i = 0 until list.size do
73               ptr[i] = list[i]
74   
75           String ptr list.size
76