{-# OPTIONS --cubical --safe #-}

module Data.Integer where

open import Level

open import Data.Nat using (; suc; zero)
import Data.Nat as 
import Data.Nat.Properties as 
open import Data.Bool

data  : Type where
     :   
  ⁻suc :   

 :   
 zero    =  zero
 (suc n) = ⁻suc n

{-# DISPLAY ⁻suc n =  suc n #-}

negate :   
negate ( x) =  x
negate (⁻suc x) =  (suc x)

{-# DISPLAY negate x =  x #-}

infixl 6 _+_

_-suc_ :     
x -suc y =
  if y ℕ.<ᴮ x
    then  (x ℕ.∸ (suc y))
    else ⁻suc (y ℕ.∸ x)

_+_ :     
    x +     y =  (x ℕ.+ y)
    x + ⁻suc y = x -suc y
⁻suc x +     y = y -suc x
⁻suc x + ⁻suc y = ⁻suc (suc x ℕ.+ y)

_*-suc_ :     
zero  *-suc m =  zero
suc n *-suc m = ⁻suc (n ℕ.+ m ℕ.+ n ℕ.* m)

infixl 7 _*_
_*_ :     
    x *     y =  (x ℕ.* y)
    x * ⁻suc y = x *-suc y
⁻suc x *     y = y *-suc x
⁻suc x * ⁻suc y =  (suc x ℕ.* suc y)