]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Maskbits.hs
Add a test for the Cidr 'enumerate' function.
[hath.git] / src / Maskbits.hs
index ac46ccf96a316a3233e961d9e00d637c95c3d11b..51701f562276ece9cc216a0d9cb649624ff7fe1c 100644 (file)
@@ -1,10 +1,10 @@
-module Maskbits
-( Maskbits(..),
-  decrement,
-  maskbits_from_string
-) where
+module Maskbits(
+  Maskbits(..),
+  )
+where
+
+import Test.QuickCheck (Arbitrary(..), elements)
 
-import Test.QuickCheck
 
 -- | A type representing the number of bits in a CIDR netmask.
 data Maskbits =
@@ -41,7 +41,7 @@ data Maskbits =
   | Thirty
   | ThirtyOne
   | ThirtyTwo
-    deriving (Eq, Ord)
+    deriving (Enum, Eq, Ord)
 
 
 instance Show Maskbits where
@@ -117,87 +117,13 @@ instance Arbitrary 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 y s
+        | y < minBound || y > maxBound = []
+        | otherwise = [(toEnum y, s)]