-module Maskbits
-( Maskbits(..),
- decrement,
- maskbits_from_string
-) where
+module Maskbits(
+ Maskbits(..) )
+where
+
+import Test.Tasty.QuickCheck ( Arbitrary(arbitrary), elements )
-import Test.QuickCheck
-- | A type representing the number of bits in a CIDR netmask.
data Maskbits =
| Thirty
| ThirtyOne
| ThirtyTwo
- deriving (Eq, Ord)
+ deriving (Enum, Eq, Ord)
instance Show Maskbits where
ThirtyTwo ]
-
--- | There are only 32 bits in an IPv4 address, so there
--- can't be more bits than that in the mask.
-maskbits_from_int :: Int -> Maybe Maskbits
-maskbits_from_int 0 = Just Zero
-maskbits_from_int 1 = Just One
-maskbits_from_int 2 = Just Two
-maskbits_from_int 3 = Just Three
-maskbits_from_int 4 = Just Four
-maskbits_from_int 5 = Just Five
-maskbits_from_int 6 = Just Six
-maskbits_from_int 7 = Just Seven
-maskbits_from_int 8 = Just Eight
-maskbits_from_int 9 = Just Nine
-maskbits_from_int 10 = Just Ten
-maskbits_from_int 11 = Just Eleven
-maskbits_from_int 12 = Just Twelve
-maskbits_from_int 13 = Just Thirteen
-maskbits_from_int 14 = Just Fourteen
-maskbits_from_int 15 = Just Fifteen
-maskbits_from_int 16 = Just Sixteen
-maskbits_from_int 17 = Just Seventeen
-maskbits_from_int 18 = Just Eighteen
-maskbits_from_int 19 = Just Nineteen
-maskbits_from_int 20 = Just Twenty
-maskbits_from_int 21 = Just TwentyOne
-maskbits_from_int 22 = Just TwentyTwo
-maskbits_from_int 23 = Just TwentyThree
-maskbits_from_int 24 = Just TwentyFour
-maskbits_from_int 25 = Just TwentyFive
-maskbits_from_int 26 = Just TwentySix
-maskbits_from_int 27 = Just TwentySeven
-maskbits_from_int 28 = Just TwentyEight
-maskbits_from_int 29 = Just TwentyNine
-maskbits_from_int 30 = Just Thirty
-maskbits_from_int 31 = Just ThirtyOne
-maskbits_from_int 32 = Just ThirtyTwo
-maskbits_from_int _ = Nothing
-
-
--- | Convert a String to Maskbits, if possible.
-maskbits_from_string :: String -> Maybe Maskbits
-maskbits_from_string s =
- case (reads s :: [(Int, String)]) of
- [] -> Nothing
- x:_ -> maskbits_from_int (fst x)
-
-
-
--- | Maskbits are just natural numbers, this returns the previous one.
-decrement :: Maskbits -> Maskbits
-decrement Zero = Zero
-decrement One = Zero
-decrement Two = One
-decrement Three = Two
-decrement Four = Three
-decrement Five = Four
-decrement Six = Five
-decrement Seven = Six
-decrement Eight = Seven
-decrement Nine = Eight
-decrement Ten = Nine
-decrement Eleven = Ten
-decrement Twelve = Eleven
-decrement Thirteen = Twelve
-decrement Fourteen = Thirteen
-decrement Fifteen = Fourteen
-decrement Sixteen = Fifteen
-decrement Seventeen = Sixteen
-decrement Eighteen = Seventeen
-decrement Nineteen = Eighteen
-decrement Twenty = Nineteen
-decrement TwentyOne = Twenty
-decrement TwentyTwo = TwentyOne
-decrement TwentyThree = TwentyTwo
-decrement TwentyFour = TwentyThree
-decrement TwentyFive = TwentyFour
-decrement TwentySix = TwentyFive
-decrement TwentySeven = TwentySix
-decrement TwentyEight = TwentySeven
-decrement TwentyNine = TwentyEight
-decrement Thirty = TwentyNine
-decrement ThirtyOne = Thirty
-decrement ThirtyTwo = ThirtyOne
+instance Read Maskbits where
+ readsPrec _ s =
+ case (reads s :: [(Int, String)]) of
+ [] -> []
+ (x,leftover):_ -> go x leftover
+ where
+ go :: Int -> String -> [(Maskbits, String)]
+ go x' leftover'
+ | x' < minBound || x' > maxBound = []
+ | otherwise = [(toEnum x', leftover')]