1    module matrix
2    
3    let are_similar (x : f32) (y : f32) = x / y - 1 |> abs < 0.001
4    
5    let are_similar (u : Vector4<f32>) (v : Vector4<f32>) =
6        are_similar u.x v.x && are_similar u.y v.y
7        && are_similar u.z v.z && are_similar u.w v.w
8    
9    do # times
10       let rotate_matrix = rotate_y (f32.pi / 2)
11       let translate_matrix = translate 5 6 7
12       let matrix = translate_matrix * rotate_matrix
13       let v = Vector4 1 2 3 1
14   
15       let result = matrix * v
16   
17       assert are_similar result (Vector4 8 8 6 1)
18   
19   do # times_order
20       let rotate_matrix = rotate_y (f32.pi / 2)
21       let translate_matrix = translate 5 6 7
22       let matrix = translate_matrix * rotate_matrix
23       let v = Vector4 1 2 3 1
24   
25       let rotate_result = rotate_matrix * v
26       let translate_result = translate_matrix * rotate_result
27       let result = matrix * v
28   
29       assert are_similar result translate_result
30   
31   do # inverse
32       let rotate_matrix = rotate_y (f32.pi / 2)
33       let translate_matrix = translate 5 6 7
34       let matrix = translate_matrix * rotate_matrix
35       let v = Vector4 1 2 3 1
36   
37       let forward = matrix * v
38       let backward = matrix.inverse * forward
39   
40       assert are_similar backward v
41