module Integer.Finite where import Data.Int (Int) import Data.Maybe qualified as Maybe import Data.Word (Word) import Essentials import Integer.Integer (Integer) import Integer.Integer qualified as Integer import Integer.Natural (Natural) import Integer.Natural qualified as Natural import Integer.Positive (Positive) import Integer.Positive qualified as Positive import Integer.Signed (Signed) import Integer.Signed qualified as Signed import Prelude (Integral) class ConvertWithFinite a where toWord :: a -> Maybe Word fromWord :: Word -> Maybe a toInt :: a -> Maybe Int fromInt :: Int -> Maybe a instance ConvertWithFinite Natural where toWord :: Natural -> Maybe Word toWord = Natural -> Maybe Word Natural.toWord fromWord :: Word -> Maybe Natural fromWord = forall a. a -> Maybe a Maybe.Just forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Word -> Natural Natural.fromWord toInt :: Natural -> Maybe Int toInt = Natural -> Maybe Int Natural.toInt fromInt :: Int -> Maybe Natural fromInt = Int -> Maybe Natural Natural.fromInt instance ConvertWithFinite Positive where toWord :: Positive -> Maybe Word toWord = Positive -> Maybe Word Positive.toWord fromWord :: Word -> Maybe Positive fromWord = Word -> Maybe Positive Positive.fromWord toInt :: Positive -> Maybe Int toInt = Positive -> Maybe Int Positive.toInt fromInt :: Int -> Maybe Positive fromInt = Int -> Maybe Positive Positive.fromInt instance ConvertWithFinite Integer where toWord :: Integer -> Maybe Word toWord = Integer -> Maybe Word Integer.toWord fromWord :: Word -> Maybe Integer fromWord = forall a. a -> Maybe a Maybe.Just forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Word -> Integer Integer.fromWord toInt :: Integer -> Maybe Int toInt = Integer -> Maybe Int Integer.toInt fromInt :: Int -> Maybe Integer fromInt = forall a. a -> Maybe a Maybe.Just forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Int -> Integer Integer.fromInt instance ConvertWithFinite Signed where toWord :: Signed -> Maybe Word toWord = Signed -> Maybe Word Signed.toWord fromWord :: Word -> Maybe Signed fromWord = forall a. a -> Maybe a Maybe.Just forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Word -> Signed Signed.fromWord toInt :: Signed -> Maybe Int toInt = Signed -> Maybe Int Signed.toInt fromInt :: Int -> Maybe Signed fromInt = forall a. a -> Maybe a Maybe.Just forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . Int -> Signed Signed.fromInt class (Bounded b, Integral b) => Finite b where toFinite :: ConvertWithFinite a => a -> Maybe b fromFinite :: ConvertWithFinite a => b -> Maybe a instance Finite Int where toFinite :: forall a. ConvertWithFinite a => a -> Maybe Int toFinite = forall a. ConvertWithFinite a => a -> Maybe Int toInt fromFinite :: forall a. ConvertWithFinite a => Int -> Maybe a fromFinite = forall a. ConvertWithFinite a => Int -> Maybe a fromInt instance Finite Word where toFinite :: forall a. ConvertWithFinite a => a -> Maybe Word toFinite = forall a. ConvertWithFinite a => a -> Maybe Word toWord fromFinite :: forall a. ConvertWithFinite a => Word -> Maybe a fromFinite = forall a. ConvertWithFinite a => Word -> Maybe a fromWord