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   object SafeSlice<T> =
29       val empty = SafeSlice<T> null 0 null 0
30       let version = 0
31   
32       def create (ptr : Ptr<T>) (size : u32) =
33           SafeSlice ptr size version@ptr 0
34   
35   type SafeSliceIterator<T> =
36       inherit Iterator<T>
37   
38       let slice : SafeSlice<T>
39       let mut index = -1
40   
41       def Iterator.move_next =
42           index += 1
43           index < slice.size
44   
45       def Iterator.get_value =
46           slice[index]
47   
48   type SafeSlice<T>
49       def try_size = Some size |> as_option
50       def get_iterator = SafeSliceIterator<T> self
51   
52       is Iterable<T>
53