ddc-code-0.3.1.1: lite/base/Data/Numeric/Int.dcl
module Int
exports
boxInt
:: [r : %].
Int# -(Alloc r | Use r)>
Int r
unboxInt
:: [r : %].
Int r -(Read r | $0)>
Int#
addInt
:: [r1 r2 r3 : %].
Int r1 -(!0 | Use r3)>
Int r2 -(Read r1 + Read r2 + Alloc r3 | Use r1 + Use r3)>
Int r3
subInt
:: [r1 r2 r3 : %].
Int r1 -(!0 | Use r3)>
Int r2 -(Read r1 + Read r2 + Alloc r3 | Use r1 + Use r3)>
Int r3
mulInt
:: [r1 r2 r3 : %].
Int r1 -(!0 | Use r3)>
Int r2 -(Read r1 + Read r2 + Alloc r3 | Use r1 + Use r3)>
Int r3
with letrec
-- | Box an integer.
boxInt [r : %]
(i : Int#) { Alloc r | Use r }
: Int r
= I# [r] i
-- | Unbox an integer.
unboxInt [r : %]
(x : Int r) { Read r | $0 }
: Int#
= case x of
I# i -> i
-- | Add two integers.
addInt [r1 r2 r3 : %]
(x : Int r1) { !0 | Use r3 }
(y : Int r2) { Read r1 + Read r2 + Alloc r3 | Use r1 + Use r3 }
: Int r3
= case x of { I# i1
-> case y of { I# i2
-> I# [r3] (add# [Int#] i1 i2) } }
-- | Subtract the second integer from the first.
subInt [r1 r2 r3 : %]
(x : Int r1) { !0 | Use r3 }
(y : Int r2) { Read r1 + Read r2 + Alloc r3 | Use r1 + Use r3 }
: Int r3
= case x of { I# i1
-> case y of { I# i2
-> I# [r3] (sub# [Int#] i1 i2) } }
-- | Multiply two integers.
mulInt [r1 r2 r3 : %]
(x : Int r1) { !0 | Use r3 }
(y : Int r2) { Read r1 + Read r2 + Alloc r3 | Use r1 + Use r3 }
: Int r3
= case x of { I# i1
-> case y of { I# i2
-> I# [r3] (mul# [Int#] i1 i2) } }