packages feed

dhall-1.28.0: dhall-lang/Prelude/Integer/subtract

{-
`subtract m n` computes `n - m`.
-}
let Natural/lessThanEqual =
        ../Natural/lessThanEqual sha256:1a5caa2b80a42b9f58fff58e47ac0d9a9946d0b2d36c54034b8ddfe3cb0f3c99
      ? ../Natural/lessThanEqual

let Integer/abs =
        ./abs sha256:35212fcbe1e60cb95b033a4a9c6e45befca4a298aa9919915999d09e69ddced1
      ? ./abs

let subtract
    : Integer → Integer → Integer
    =   λ(m : Integer)
      → λ(n : Integer)
      → let mAbs = Integer/abs m

        let nAbs = Integer/abs n

        let mNonPos = Natural/isZero (Integer/clamp m)

        let nNonPos = Natural/isZero (Integer/clamp n)

        let diff =
                    if mNonPos == nNonPos

              then        if Natural/lessThanEqual mAbs nAbs

                    then  Integer/negate
                            (Natural/toInteger (Natural/subtract mAbs nAbs))

                    else  Natural/toInteger (Natural/subtract nAbs mAbs)

              else  Natural/toInteger (mAbs + nAbs)

        in  if mNonPos then diff else Integer/negate diff

let example0 = assert : subtract +3 +5 ≡ +2

let example1 = assert : subtract +4 +4 ≡ +0

let example2 = assert : subtract +5 +3 ≡ -2

let example3 = assert : subtract -3 -5 ≡ -2

let example4 = assert : subtract -4 -4 ≡ +0

let example5 = assert : subtract -5 -3 ≡ +2

let example6 = assert : subtract -3 +5 ≡ +8

let example7 = assert : subtract +3 -5 ≡ -8

let example8 = assert : subtract +0 -3 ≡ -3

in  subtract