src/float/num.bend
bend-lawful-stdlib@0.1.0.0 · 49 lines · 8 definitions
1import Base
2import bend-lawful-stdlib@0.1.0.0/src/float/format.bend as Fmt
3
4
5
6
7
8
9
10
11
12
13
14
15
16type Impl<-T: Data> is Type:
17 Impl{fmt: Fmt.Format, value: T -> Fmt.Val, add: T -> T -> T, mul: T -> T -> T}
18
19def Impl.fmt(-T: Data, i: Impl<T>) -> Fmt.Format:
20 match i:
21 case Impl{fmt, value, add, mul}:
22 fmt
23
24def Impl.value(-T: Data, i: Impl<T>, x: T) -> Fmt.Val:
25 match i:
26 case Impl{fmt, value, add, mul}:
27 value(x)
28
29def Impl.add(-T: Data, i: Impl<T>, a: T, b: T) -> T:
30 match i:
31 case Impl{fmt, value, add, mul}:
32 add(a, b)
33
34def Impl.mul(-T: Data, i: Impl<T>, a: T, b: T) -> T:
35 match i:
36 case Impl{fmt, value, add, mul}:
37 mul(a, b)
38
39
40def AddOk(~T: Data, ~i: Impl<T>, a: T, b: T) -> Type:
41 {Fmt.canon(Impl.value(T, i, Impl.add(T, i, a, b))) == Fmt.canon(Fmt.spec_add(Impl.fmt(T, i), Impl.value(T, i, a), Impl.value(T, i, b))) : Fmt.Val}
42
43
44def MulOk(~T: Data, ~i: Impl<T>, a: T, b: T) -> Type:
45 {Fmt.canon(Impl.value(T, i, Impl.mul(T, i, a, b))) == Fmt.canon(Fmt.spec_mul(Impl.fmt(T, i), Impl.value(T, i, a), Impl.value(T, i, b))) : Fmt.Val}
46
47
48type Correct<-T: Data, -i: Impl<T>> is Type:
49 Correct{add: @a: T -> @b: T -> AddOk(~T, ~i, a, b), mul: @a: T -> @b: T -> MulOk(~T, ~i, a, b)}