@@ -17,13 +17,15 @@ module Data.Enum
1717 , enumFromThenTo
1818 ) where
1919
20+ import Prelude
21+
2022import Data.Maybe
2123import Data.Either
2224import Data.Tuple
2325import Data.Char
2426import Data.Maybe.Unsafe
2527import Data.Unfoldable
26- import Data.Int (Int (), fromNumber )
28+ import Data.Int (fromNumber )
2729
2830newtype Cardinality a = Cardinality Int
2931
@@ -81,26 +83,26 @@ defaultFromEnum pred' e = maybe zero (\prd -> defaultFromEnum pred' prd + one) (
8183-- | Property: ```fromEnum a = a', fromEnum b = b' => forall e', a' <= e' <= b': Exists e: toEnum e' = Just e```
8284-- |
8385-- | Following from the propery of `intFromTo`, we are sure all elements in `intFromTo (fromEnum a) (fromEnum b)` are `Just`s.
84- enumFromTo :: forall a . (Enum a ) => a -> a -> [ a ]
86+ enumFromTo :: forall a . (Enum a ) => a -> a -> Array a
8587enumFromTo a b = (toEnum >>> fromJust) <$> intFromTo a' b'
8688 where a' = fromEnum a
8789 b' = fromEnum b
8890
8991-- | `[a,b..c]`
9092-- |
9193-- | Correctness for using `fromJust` is the same as for `enumFromTo`.
92- enumFromThenTo :: forall a . (Enum a ) => a -> a -> a -> [ a ]
94+ enumFromThenTo :: forall a . (Enum a ) => a -> a -> a -> Array a
9395enumFromThenTo a b c = (toEnum >>> fromJust) <$> intStepFromTo (b' - a') a' c'
9496 where a' = fromEnum a
9597 b' = fromEnum b
9698 c' = fromEnum c
9799
98100-- | Property: ```forall e in intFromTo a b: a <= e <= b```
99- intFromTo :: Int -> Int -> [ Int ]
101+ intFromTo :: Int -> Int -> Array Int
100102intFromTo = intStepFromTo one
101103
102104-- | Property: ```forall e in intStepFromTo step a b: a <= e <= b```
103- intStepFromTo :: Int -> Int -> Int -> [ Int ]
105+ intStepFromTo :: Int -> Int -> Int -> Array Int
104106intStepFromTo step from to =
105107 unfoldr (\e ->
106108 if e <= to
@@ -111,15 +113,15 @@ intStepFromTo step from to =
111113-- | ## Instances
112114
113115instance enumChar :: Enum Char where
114- cardinality = Cardinality (fromNumber ( 65535 + 1 ))
116+ cardinality = Cardinality 65536
115117 succ = defaultSucc charToEnum charFromEnum
116118 pred = defaultPred charToEnum charFromEnum
117119 toEnum = charToEnum
118120 fromEnum = charFromEnum
119121
120122-- | To avoid a compiler bug - can't pass self-class functions, workaround: need to make a concrete function.
121123charToEnum :: Int -> Maybe Char
122- charToEnum n | n >= zero && n <= (fromNumber 65535 ) = Just $ fromCharCode n
124+ charToEnum n | n >= 0 && n <= 65535 = Just $ fromCharCode n
123125charToEnum _ = Nothing
124126
125127charFromEnum :: Char -> Int
@@ -146,7 +148,7 @@ maybeCardinality :: forall a. (Enum a) => Cardinality a -> Cardinality (Maybe a)
146148maybeCardinality c = Cardinality $ one + (runCardinality c)
147149
148150instance enumBoolean :: Enum Boolean where
149- cardinality = Cardinality (fromNumber 2 )
151+ cardinality = Cardinality 2
150152 succ = booleanSucc
151153 pred = booleanPred
152154 toEnum = defaultToEnum booleanSucc bottom
0 commit comments