diff --git a/src/Data/Enum.purs b/src/Data/Enum.purs index 71d41f3..2939698 100644 --- a/src/Data/Enum.purs +++ b/src/Data/Enum.purs @@ -193,12 +193,8 @@ instance boundedEnumOrdering :: BoundedEnum Ordering where instance boundedEnumMaybe :: BoundedEnum a => BoundedEnum (Maybe a) where cardinality = Cardinality $ unwrap (cardinality :: Cardinality a) + 1 - toEnum = to cardinality - where - to :: Cardinality a -> Int -> Maybe (Maybe a) - to _ 0 = Nothing - to (Cardinality ca) n | n <= ca = Just $ toEnum (n - 1) - to _ _ = Nothing + toEnum 0 = pure Nothing + toEnum n = Just <$> toEnum (n - 1) fromEnum Nothing = 0 fromEnum (Just e) = fromEnum e + 1 diff --git a/test/Test/Data/Enum.purs b/test/Test/Data/Enum.purs index c57b50f..52b413f 100644 --- a/test/Test/Data/Enum.purs +++ b/test/Test/Data/Enum.purs @@ -7,7 +7,7 @@ import Control.Monad.Eff.Console (CONSOLE, log) import Data.Enum (class Enum, class BoundedEnum, defaultToEnum, defaultFromEnum, defaultCardinality, enumFromTo, enumFromThenTo, upFrom, - downFrom) + downFrom, toEnum) import Data.Maybe (Maybe(..)) import Test.Assert (ASSERT, assert) @@ -63,3 +63,10 @@ testEnum = do assert $ downFrom D == [C, B, A] assert $ downFrom B == [ A] assert $ downFrom A == [ ] + + log "BoundedEnum (Maybe Boolean)" + assert $ toEnum (-1) == Nothing :: Maybe (Maybe Boolean) + assert $ toEnum 0 == Just Nothing :: Maybe (Maybe Boolean) + assert $ toEnum 1 == Just (Just false) :: Maybe (Maybe Boolean) + assert $ toEnum 2 == Just (Just true) :: Maybe (Maybe Boolean) + assert $ toEnum 3 == Nothing :: Maybe (Maybe Boolean)