packages feed

ddc-code-0.3.1.1: lite/base/Math/Integer.dcl

module Integer 
imports {
        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

fac    [r : %] 
       (acc : Int r) {!0 | Use r}
       (n   : Int r) {Read r + Alloc r | Use r} : Int r
 =  case n of { 
        I# i -> 
         case i of {
                0i#   -> acc;
                1i#   -> acc;
                _       -> fac [r] (mulInt [:r r r:] acc n)
                                   (subInt [:r r r:] n (I# [r] 1i#));
         };
 }