From 0b8907421397a5f105149283f36fdd3b7d7e2c2a Mon Sep 17 00:00:00 2001 From: Brandon Elam Barker Date: Wed, 10 Jul 2019 15:33:09 +0000 Subject: [PATCH 1/4] added SmallBounded, SmallBoundedEnum, and boundedEnumMaybe --- src/Data/Enum.purs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Data/Enum.purs b/src/Data/Enum.purs index 0bb9287..19f6ae6 100644 --- a/src/Data/Enum.purs +++ b/src/Data/Enum.purs @@ -21,7 +21,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 +316,19 @@ 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 boundedEnumMaybe :: 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 From ff423fe1f994d2ca38fcf5b57b0ce911cfc889cd Mon Sep 17 00:00:00 2001 From: Brandon Elam Barker Date: Wed, 10 Jul 2019 15:57:47 +0000 Subject: [PATCH 2/4] fixes for exports and boundedEnumMaybe --- src/Data/Enum.purs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Data/Enum.purs b/src/Data/Enum.purs index 19f6ae6..807b0b9 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 @@ -326,9 +328,10 @@ class Bounded a <= SmallBounded a -- | Cardinality a << Cardinality Int class BoundedEnum a <= SmallBoundedEnum a -instance boundedEnumMaybe :: 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 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 From 97b3affedf600b88bb2ed3b4340d1a4d3e657f0a Mon Sep 17 00:00:00 2001 From: Brandon Elam Barker Date: Wed, 10 Jul 2019 19:01:47 +0000 Subject: [PATCH 3/4] auto-derive SmallBoundedEnum instances --- src/Data/Enum.purs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Data/Enum.purs b/src/Data/Enum.purs index 807b0b9..23db8b6 100644 --- a/src/Data/Enum.purs +++ b/src/Data/Enum.purs @@ -320,7 +320,7 @@ foreign import toCharCode :: Char -> Int foreign import fromCharCode :: Int -> Char --- | A lawful subclass of `Bounded `to denote +-- | A lawful subclass of `Bounded` to denote -- | Cardinality a << Cardinality Int class Bounded a <= SmallBounded a @@ -328,6 +328,9 @@ class Bounded a <= SmallBounded a -- | 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 From 1979eb74baec39b5e62567948f402b4194230e9f Mon Sep 17 00:00:00 2001 From: Brandon Elam Barker Date: Mon, 29 Jul 2019 18:54:54 +0000 Subject: [PATCH 4/4] adding instance smallBoundedBoolean --- src/Data/Enum.purs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Data/Enum.purs b/src/Data/Enum.purs index 23db8b6..e2d980a 100644 --- a/src/Data/Enum.purs +++ b/src/Data/Enum.purs @@ -338,3 +338,6 @@ instance boundedEnumMaybe :: (SmallBounded a, BoundedEnum a) toEnum n = Just <$> toEnum (n - 1) fromEnum Nothing = 0 fromEnum (Just e) = fromEnum e + 1 + +instance smallBoundedBoolean :: SmallBounded Boolean +