2 | import Derive.Prelude
3 | import Derive.Refined
5 | %language ElabReflection
10 | ValidScale : Double -> Bool
11 | ValidScale x = 1.0e-6 <= x && x <= 1.0e6
18 | {auto 0 prf : Holds ValidScale value}
20 | %runElab derive "Scale" [Show,Eq,Ord,RefinedDouble]
24 | scale : Double -> Scale
25 | scale x = case refineScale x of
27 | Nothing => if x < 1.0e-6 then S 1.0e-6 else S 1.0e6
32 | inverse : Scale -> Scale
33 | inverse (S v) = scale $
1 / v
37 | (*) : Scale -> Scale -> Scale
38 | S x * S y = scale $
x * y
42 | (/) : Scale -> Scale -> Scale
43 | S x / S y = scale $
x / y