{-
`multiply m n` computes `m * n`.
-}

let nonPositive =
        ./nonPositive sha256:e00a852eed5b84ff60487097d8aadce53c9e5301f53ff4954044bd68949fac3b
      ? ./nonPositive

let multiplyNonNegative =
        λ(x : Integer)
      → λ(y : Integer)
      → Natural/toInteger (Integer/clamp x * Integer/clamp y)

let multiply
    : Integer → Integer → Integer
    =   λ(m : Integer)
      → λ(n : Integer)
      →       if nonPositive m

        then        if nonPositive n

              then  multiplyNonNegative (Integer/negate m) (Integer/negate n)

              else  Integer/negate (multiplyNonNegative (Integer/negate m) n)

        else  if nonPositive n

        then  Integer/negate (multiplyNonNegative m (Integer/negate n))

        else  multiplyNonNegative m n

let example0 = assert : multiply +3 +5 ≡ +15

let example1 = assert : multiply -3 +5 ≡ -15

let example2 = assert : multiply -3 -5 ≡ +15

let example3 = assert : multiply +0 +5 ≡ +0

let example4 = assert : multiply +5 +0 ≡ +0

let example5 = assert : multiply +0 +0 ≡ +0

let example6 = assert : multiply +1 +5 ≡ +5

let example7 = assert : multiply +3 -1 ≡ -3

in  multiply
