packages feed

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) } }