1    type SafeSlice<T> @byval =
2        val ptr : Ptr<T>
3        val size : u32
4        val version : Ptr<u32>
5        val created_at : u32
6    
7        let validate () =
8            assert version@value == created_at
9    
10       fun get (i : u32) =
11           validate
12           ptr[i]
13   
14       fun get (i : i32) =
15           validate
16           assert i >= 0
17           ptr[i]
18   
19       fun get_ptr (i : u32) =
20           validate
21           ptr + i
22   
23       fun get_ptr (i : i32) =
24           validate
25           assert i >= 0
26           ptr + i
27   
28       def is_empty = size == 0
29       def is_not_empty = size <> 0
30   
31   object SafeSlice<T> =
32       val empty = SafeSlice<T> null 0 null 0
33       let version = 0
34   
35       def create (ptr : Ptr<T>) (size : u32) =
36           SafeSlice ptr size version@ptr 0
37   
38   type SafeSliceIterator<T> =
39       inherit Iterator<T>
40   
41       let slice : SafeSlice<T>
42       let mut index = -1
43   
44       def Iterator.move_next =
45           index += 1
46           index < slice.size
47   
48       def Iterator.get_value =
49           slice[index]
50   
51   type SafeSlice<T>
52       def try_size = Some size |> as_option
53       def get_iterator = SafeSliceIterator<T> self
54   
55       is Iterable<T>
56