Integer.hs (1040B)
1 module Lude.Haskell.Integer ( 2 Integer, 3 pattern IntegerNegSucc, 4 pattern IntegerZero, 5 pattern IntegerPosSucc, 6 integerSign, 7 ) where 8 9 import Numeric.Natural (Natural) 10 import Prelude (Integer, fromInteger, fromIntegral, negate, (+), (-), (<), (==)) 11 12 -------------------------------------------------------------------------------- 13 14 pattern IntegerNegSucc :: Natural -> Integer 15 pattern IntegerNegSucc n <- (integerSign -> NegSucc n) where IntegerNegSucc n = -fromIntegral (n + 1) 16 pattern IntegerZero :: Integer 17 pattern IntegerZero <- (integerSign -> Zero) where IntegerZero = 0 18 pattern IntegerPosSucc :: Natural -> Integer 19 pattern IntegerPosSucc n <- (integerSign -> PosSucc n) where IntegerPosSucc n = fromIntegral (n + 1) 20 {-# COMPLETE IntegerNegSucc, IntegerZero, IntegerPosSucc #-} 21 22 -- TODO: Generalize to ordered rings 23 data Sign = NegSucc Natural | Zero | PosSucc Natural 24 integerSign :: Integer -> Sign 25 integerSign = \case 26 0 -> Zero 27 n | n < 0 -> NegSucc (fromInteger (-n) - 1) 28 n -> PosSucc (fromInteger n - 1)