|
| 1 | +module Test.Data.Enum.Generic where |
| 2 | + |
| 3 | +import Prelude |
| 4 | + |
| 5 | +import Data.Enum (class BoundedEnum, class Enum, Cardinality(..), cardinality, fromEnum, pred, succ, toEnum, enumFromTo) |
| 6 | +import Data.Generic.Rep as G |
| 7 | +import Data.Bounded.Generic as GBounded |
| 8 | +import Data.Enum.Generic as GEnum |
| 9 | +import Data.Eq.Generic as GEq |
| 10 | +import Data.Ord.Generic as GOrd |
| 11 | +import Data.Show.Generic as GShow |
| 12 | +import Data.Maybe (Maybe(..)) |
| 13 | +import Effect (Effect) |
| 14 | +import Effect.Console (log) |
| 15 | +import Test.Assert (assert) |
| 16 | + |
| 17 | +data SimpleBounded = A | B | C | D |
| 18 | +derive instance genericSimpleBounded :: G.Generic SimpleBounded _ |
| 19 | +instance eqSimpleBounded :: Eq SimpleBounded where |
| 20 | + eq x y = GEq.genericEq x y |
| 21 | +instance ordSimpleBounded :: Ord SimpleBounded where |
| 22 | + compare x y = GOrd.genericCompare x y |
| 23 | +instance showSimpleBounded :: Show SimpleBounded where |
| 24 | + show x = GShow.genericShow x |
| 25 | +instance boundedSimpleBounded :: Bounded SimpleBounded where |
| 26 | + bottom = GBounded.genericBottom |
| 27 | + top = GBounded.genericTop |
| 28 | +instance enumSimpleBounded :: Enum SimpleBounded where |
| 29 | + pred = GEnum.genericPred |
| 30 | + succ = GEnum.genericSucc |
| 31 | +instance boundedEnumSimpleBounded :: BoundedEnum SimpleBounded where |
| 32 | + cardinality = GEnum.genericCardinality |
| 33 | + toEnum = GEnum.genericToEnum |
| 34 | + fromEnum = GEnum.genericFromEnum |
| 35 | + |
| 36 | +data Option a = None | Some a |
| 37 | +derive instance genericOption :: G.Generic (Option a) _ |
| 38 | +instance eqOption :: Eq a => Eq (Option a) where |
| 39 | + eq x y = GEq.genericEq x y |
| 40 | +instance ordOption :: Ord a => Ord (Option a) where |
| 41 | + compare x y = GOrd.genericCompare x y |
| 42 | +instance showOption :: Show a => Show (Option a) where |
| 43 | + show x = GShow.genericShow x |
| 44 | +instance boundedOption :: Bounded a => Bounded (Option a) where |
| 45 | + bottom = GBounded.genericBottom |
| 46 | + top = GBounded.genericTop |
| 47 | +instance enumOption :: (Bounded a, Enum a) => Enum (Option a) where |
| 48 | + pred = GEnum.genericPred |
| 49 | + succ = GEnum.genericSucc |
| 50 | +instance boundedEnumOption :: BoundedEnum a => BoundedEnum (Option a) where |
| 51 | + cardinality = GEnum.genericCardinality |
| 52 | + toEnum = GEnum.genericToEnum |
| 53 | + fromEnum = GEnum.genericFromEnum |
| 54 | + |
| 55 | +data Bit = Zero | One |
| 56 | +derive instance genericBit :: G.Generic Bit _ |
| 57 | +instance eqBit :: Eq Bit where |
| 58 | + eq x y = GEq.genericEq x y |
| 59 | +instance ordBit :: Ord Bit where |
| 60 | + compare x y = GOrd.genericCompare x y |
| 61 | +instance showBit :: Show Bit where |
| 62 | + show x = GShow.genericShow x |
| 63 | +instance boundedBit :: Bounded Bit where |
| 64 | + bottom = GBounded.genericBottom |
| 65 | + top = GBounded.genericTop |
| 66 | +instance enumBit :: Enum Bit where |
| 67 | + pred = GEnum.genericPred |
| 68 | + succ = GEnum.genericSucc |
| 69 | +instance boundedEnumBit :: BoundedEnum Bit where |
| 70 | + cardinality = GEnum.genericCardinality |
| 71 | + toEnum = GEnum.genericToEnum |
| 72 | + fromEnum = GEnum.genericFromEnum |
| 73 | + |
| 74 | +data Pair a b = Pair a b |
| 75 | +derive instance genericPair :: G.Generic (Pair a b) _ |
| 76 | +instance eqPair :: (Eq a, Eq b) => Eq (Pair a b) where |
| 77 | + eq = GEq.genericEq |
| 78 | +instance ordPair :: (Ord a, Ord b) => Ord (Pair a b) where |
| 79 | + compare = GOrd.genericCompare |
| 80 | +instance showPair :: (Show a, Show b) => Show (Pair a b) where |
| 81 | + show = GShow.genericShow |
| 82 | +instance boundedPair :: (Bounded a, Bounded b) => Bounded (Pair a b) where |
| 83 | + bottom = GBounded.genericBottom |
| 84 | + top = GBounded.genericTop |
| 85 | +instance enumPair :: (Bounded a, Enum a, Bounded b, Enum b) => Enum (Pair a b) where |
| 86 | + pred = GEnum.genericPred |
| 87 | + succ = GEnum.genericSucc |
| 88 | +instance boundedEnumPair :: (BoundedEnum a, BoundedEnum b) => BoundedEnum (Pair a b) where |
| 89 | + cardinality = GEnum.genericCardinality |
| 90 | + toEnum = GEnum.genericToEnum |
| 91 | + fromEnum = GEnum.genericFromEnum |
| 92 | + |
| 93 | +testGenericEnum :: Effect Unit |
| 94 | +testGenericEnum = do |
| 95 | + log "Checking simple pred bottom" |
| 96 | + assert $ pred (bottom :: SimpleBounded) == Nothing |
| 97 | + |
| 98 | + log "Checking simple (pred =<< succ bottom)" |
| 99 | + assert $ (pred =<< succ bottom) == Just A |
| 100 | + |
| 101 | + log "Checking simple succ top" |
| 102 | + assert $ succ (top :: SimpleBounded) == Nothing |
| 103 | + |
| 104 | + log "Checking simple (succ =<< pred top)" |
| 105 | + assert $ (succ =<< pred top) == Just D |
| 106 | + |
| 107 | + log "Checking composite pred bottom" |
| 108 | + assert $ pred (bottom :: Option SimpleBounded) == Nothing |
| 109 | + |
| 110 | + log "Checking composite (pred =<< succ bottom)" |
| 111 | + assert $ (pred =<< succ (bottom :: Option SimpleBounded)) == Just None |
| 112 | + |
| 113 | + log "Checking composite succ top" |
| 114 | + assert $ succ (top :: Option SimpleBounded) == Nothing |
| 115 | + |
| 116 | + log "Checking composite (succ =<< pred top)" |
| 117 | + assert $ (succ =<< pred top) == Just (Some D) |
| 118 | + |
| 119 | + log "Checking product pred bottom" |
| 120 | + assert $ pred (bottom :: Pair Bit SimpleBounded) == Nothing |
| 121 | + |
| 122 | + log "Checking product (pred =<< succ bottom)" |
| 123 | + assert $ (pred =<< succ (bottom :: Pair Bit SimpleBounded)) == Just (Pair Zero A) |
| 124 | + |
| 125 | + log "Checking product succ top" |
| 126 | + assert $ succ (top :: Pair Bit SimpleBounded) == Nothing |
| 127 | + |
| 128 | + log "Checking product (succ =<< pred top)" |
| 129 | + assert $ (succ =<< pred top) == Just (Pair One D) |
| 130 | + |
| 131 | + log "Checking simple cardinality" |
| 132 | + assert $ (cardinality :: Cardinality SimpleBounded) == Cardinality 4 |
| 133 | + |
| 134 | + log "Checking composite cardinality" |
| 135 | + assert $ (cardinality :: Cardinality (Option SimpleBounded)) == Cardinality 5 |
| 136 | + |
| 137 | + log "Checking product cardinality" |
| 138 | + assert $ (cardinality :: Cardinality (Pair Bit SimpleBounded)) == Cardinality 8 |
| 139 | + |
| 140 | + log "Checking simple toEnum/fromEnum roundtrip" |
| 141 | + assert $ toEnum (fromEnum A) == Just A |
| 142 | + assert $ toEnum (fromEnum B) == Just B |
| 143 | + |
| 144 | + log "Checking composite toEnum/fromEnum roundtrip" |
| 145 | + assert $ toEnum (fromEnum (None :: Option SimpleBounded)) == Just (None :: Option SimpleBounded) |
| 146 | + assert $ toEnum (fromEnum (Some A)) == Just (Some A) |
| 147 | + |
| 148 | + log "Checking product toEnum/fromEnum roundtrip" |
| 149 | + assert $ let allPairs = enumFromTo bottom top :: Array (Pair Bit SimpleBounded) |
| 150 | + in (toEnum <<< fromEnum <$> allPairs) == (Just <$> allPairs) |
0 commit comments