diff --git a/src/Data/Enum.purs b/src/Data/Enum.purs index 0bb9287..e2d980a 100644 --- a/src/Data/Enum.purs +++ b/src/Data/Enum.purs @@ -14,6 +14,8 @@ module Data.Enum , defaultCardinality , defaultToEnum , defaultFromEnum + , class SmallBounded + , class SmallBoundedEnum ) where import Prelude @@ -21,7 +23,7 @@ import Prelude import Control.MonadPlus (guard) import Data.Either (Either(..)) import Data.Maybe (Maybe(..), maybe, fromJust) -import Data.Newtype (class Newtype) +import Data.Newtype (class Newtype, unwrap) import Data.Tuple (Tuple(..)) import Data.Unfoldable (class Unfoldable, singleton, unfoldr) import Data.Unfoldable1 (class Unfoldable1, unfoldr1) @@ -316,3 +318,26 @@ charToEnum _ = Nothing foreign import toCharCode :: Char -> Int foreign import fromCharCode :: Int -> Char + + +-- | A lawful subclass of `Bounded` to denote +-- | Cardinality a << Cardinality Int +class Bounded a <= SmallBounded a + +-- | A lawful subclass of `BoundedEnum` to denote +-- | Cardinality a << Cardinality Int +class BoundedEnum a <= SmallBoundedEnum a + +instance smallBoundedEnum :: (SmallBounded a, BoundedEnum a) + => SmallBoundedEnum a + +instance boundedEnumMaybe :: (SmallBounded a, BoundedEnum a) + => BoundedEnum (Maybe a) where + cardinality = Cardinality $ unwrap (cardinality :: Cardinality a) + 1 + toEnum 0 = Nothing + toEnum n = Just <$> toEnum (n - 1) + fromEnum Nothing = 0 + fromEnum (Just e) = fromEnum e + 1 + +instance smallBoundedBoolean :: SmallBounded Boolean +