2021-06-04 12:35:07 +03:00
|
|
|
module TestIntegers
|
|
|
|
|
|
|
|
import Data.Bits
|
|
|
|
import Data.List.Quantifiers
|
|
|
|
|
|
|
|
put : Show a => a -> IO ()
|
|
|
|
put = putStrLn . show
|
|
|
|
|
|
|
|
castAllTo : (to : Type)
|
|
|
|
-> {0 types : List Type}
|
|
|
|
-> All (flip Cast to) types => HList types -> List to
|
|
|
|
castAllTo to = forget . imapProperty (flip Cast to) (cast {to})
|
|
|
|
|
|
|
|
interface Num a => Bits a => SomeBits a where
|
|
|
|
one : Index {a}
|
|
|
|
|
|
|
|
SomeBits Bits8 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Bits16 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Bits32 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Bits64 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Int8 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Int16 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Int32 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Int64 where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Int where
|
2021-12-16 21:26:52 +03:00
|
|
|
one = 1
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
SomeBits Integer where
|
|
|
|
one = 1
|
|
|
|
|
|
|
|
interface Num a => Ord a => NumOrd a where
|
|
|
|
|
|
|
|
Num a => Ord a => NumOrd a where
|
|
|
|
|
|
|
|
main : IO ()
|
|
|
|
main = do
|
|
|
|
let ints = the (HList _) [
|
|
|
|
the Bits8 0, -- Bits8 min
|
|
|
|
the Bits8 50,
|
|
|
|
the Bits8 255, -- Bits8 max
|
|
|
|
the Bits16 0, -- Bits16 min
|
|
|
|
the Bits16 10000,
|
|
|
|
the Bits16 65535, -- Bits16 max
|
|
|
|
the Bits32 0, -- Bits32 min
|
|
|
|
the Bits32 1000000000,
|
|
|
|
the Bits32 4294967295, -- Bits32 max
|
|
|
|
the Bits64 0, -- Bits64 min
|
|
|
|
the Bits64 5000000000000000000,
|
|
|
|
the Bits64 18446744073709551615, -- Bits64 max
|
|
|
|
the Int8 $ -128, -- Int8 min
|
|
|
|
the Int8 50,
|
|
|
|
the Int8 127, -- Int8 max
|
|
|
|
the Int16 $ -32768, -- Int16 min
|
|
|
|
the Int16 10000,
|
|
|
|
the Int16 32767, -- Int16 max
|
|
|
|
the Int32 $ -2147483648, -- Int32 min
|
|
|
|
the Int32 500000000,
|
|
|
|
the Int32 2147483647, -- Int32 max
|
|
|
|
the Int64 $ -9223372036854775808, -- Int64 min
|
|
|
|
the Int64 1000000000000000000,
|
|
|
|
the Int64 9223372036854775807, -- Int64 max
|
2021-07-10 13:15:21 +03:00
|
|
|
the Int $ -2147483648, -- Int min
|
|
|
|
the Int 500000000,
|
|
|
|
the Int 2147483647, -- Int max
|
2021-06-04 12:35:07 +03:00
|
|
|
the Integer $ -9223372036854775809, -- Int min - 1
|
|
|
|
the Integer 0,
|
|
|
|
the Integer 9223372036854775808 -- Int max + 1
|
|
|
|
]
|
|
|
|
|
|
|
|
putStrLn "Cast to String:"
|
|
|
|
put ints
|
|
|
|
|
|
|
|
putStrLn "Cast to Bits8:"
|
|
|
|
put $ castAllTo Bits8 ints
|
|
|
|
|
|
|
|
putStrLn "Cast to Bits16:"
|
|
|
|
put $ castAllTo Bits16 ints
|
|
|
|
|
|
|
|
putStrLn "Cast to Bits32:"
|
|
|
|
put $ castAllTo Bits32 ints
|
|
|
|
|
|
|
|
putStrLn "Cast to Bits64:"
|
|
|
|
put $ castAllTo Bits64 ints
|
|
|
|
|
|
|
|
putStrLn "Cast to Int:"
|
|
|
|
put $ castAllTo Int ints
|
|
|
|
|
|
|
|
putStrLn "Cast to Integer:"
|
|
|
|
put $ castAllTo Integer ints
|
|
|
|
|
|
|
|
putStrLn "Add:"
|
|
|
|
put $ imapProperty Num (+ 1) ints
|
|
|
|
|
|
|
|
putStrLn "Subtract:"
|
|
|
|
put $ imapProperty Neg (flip (-) 1) ints
|
|
|
|
|
|
|
|
putStrLn "Negate:"
|
|
|
|
put $ imapProperty Neg negate ints
|
|
|
|
|
|
|
|
putStrLn "Multiply:"
|
|
|
|
put $ imapProperty Num (* 2) ints
|
|
|
|
|
2022-03-02 18:18:33 +03:00
|
|
|
putStrLn "Divide:"
|
|
|
|
put $ imapProperty Integral (`div` 3) ints
|
|
|
|
put $ imapProperty Integral (`div` -3) ints
|
|
|
|
|
|
|
|
putStrLn "Mod:"
|
|
|
|
put $ imapProperty Integral (`mod` 17) ints
|
|
|
|
put $ imapProperty Integral (`mod` -17) ints
|
|
|
|
|
|
|
|
putStrLn "Division Euclidean:"
|
|
|
|
put $ imapProperty Integral (\x => (x `div` 19) * 19 + (x `mod` 19)) ints
|
|
|
|
put $ imapProperty Integral (\x => (x `div` -19) * -19 + (x `mod` -19)) ints
|
2021-06-04 12:35:07 +03:00
|
|
|
|
|
|
|
putStrLn "Shift:"
|
|
|
|
put $ imapProperty SomeBits (`shiftL` one) ints
|
|
|
|
put $ imapProperty SomeBits (`shiftR` one) ints
|
|
|
|
|
|
|
|
putStrLn "Bit Ops:"
|
|
|
|
put $ imapProperty SomeBits (.&. 0xAA) ints
|
|
|
|
put $ imapProperty SomeBits (.|. 0xAA) ints
|
|
|
|
put $ imapProperty SomeBits (`xor` 0xAA) ints
|
|
|
|
|
|
|
|
putStrLn "Comparisons:"
|
|
|
|
put $ imapProperty NumOrd (< 0) ints
|
|
|
|
put $ imapProperty NumOrd (< 1) ints
|
|
|
|
put $ imapProperty NumOrd (> 0) ints
|
|
|
|
put $ imapProperty NumOrd (> 1) ints
|
|
|
|
put $ imapProperty NumOrd (== 0) ints
|
|
|
|
put $ imapProperty NumOrd (<= 0) ints
|
|
|
|
put $ imapProperty NumOrd (<= 1) ints
|
|
|
|
put $ imapProperty NumOrd (>= 0) ints
|
|
|
|
put $ imapProperty NumOrd (>= 1) ints
|