import Test.QuickCheck
--- A type representing the number of bits in a CIDR netmask.
-data Maskbits = None
- | Zero
- | One
- | Two
- | Three
- | Four
- | Five
- | Six
- | Seven
- | Eight
- | Nine
- | Ten
- | Eleven
- | Twelve
- | Thirteen
- | Fourteen
- | Fifteen
- | Sixteen
- | Seventeen
- | Eighteen
- | Nineteen
- | Twenty
- | TwentyOne
- | TwentyTwo
- | TwentyThree
- | TwentyFour
- | TwentyFive
- | TwentySix
- | TwentySeven
- | TwentyEight
- | TwentyNine
- | Thirty
- | ThirtyOne
- | ThirtyTwo
- deriving (Eq, Ord)
+-- | A type representing the number of bits in a CIDR netmask.
+data Maskbits =
+ Zero
+ | One
+ | Two
+ | Three
+ | Four
+ | Five
+ | Six
+ | Seven
+ | Eight
+ | Nine
+ | Ten
+ | Eleven
+ | Twelve
+ | Thirteen
+ | Fourteen
+ | Fifteen
+ | Sixteen
+ | Seventeen
+ | Eighteen
+ | Nineteen
+ | Twenty
+ | TwentyOne
+ | TwentyTwo
+ | TwentyThree
+ | TwentyFour
+ | TwentyFive
+ | TwentySix
+ | TwentySeven
+ | TwentyEight
+ | TwentyNine
+ | Thirty
+ | ThirtyOne
+ | ThirtyTwo
+ deriving (Eq, Ord)
instance Show Maskbits where
- show None = "None"
- show Zero = "0"
- show One = "1"
- show Two = "2"
- show Three = "3"
- show Four = "4"
- show Five = "5"
- show Six = "6"
- show Seven = "7"
- show Eight = "8"
- show Nine = "9"
- show Ten = "10"
- show Eleven = "11"
- show Twelve = "12"
- show Thirteen = "13"
- show Fourteen = "14"
- show Fifteen = "15"
- show Sixteen = "16"
- show Seventeen = "17"
- show Eighteen = "18"
- show Nineteen = "19"
- show Twenty = "20"
- show TwentyOne = "21"
- show TwentyTwo = "22"
- show TwentyThree = "23"
- show TwentyFour = "24"
- show TwentyFive = "25"
- show TwentySix = "26"
- show TwentySeven = "27"
- show TwentyEight = "28"
- show TwentyNine = "29"
- show Thirty = "30"
- show ThirtyOne = "31"
- show ThirtyTwo = "32"
+ show Zero = "0"
+ show One = "1"
+ show Two = "2"
+ show Three = "3"
+ show Four = "4"
+ show Five = "5"
+ show Six = "6"
+ show Seven = "7"
+ show Eight = "8"
+ show Nine = "9"
+ show Ten = "10"
+ show Eleven = "11"
+ show Twelve = "12"
+ show Thirteen = "13"
+ show Fourteen = "14"
+ show Fifteen = "15"
+ show Sixteen = "16"
+ show Seventeen = "17"
+ show Eighteen = "18"
+ show Nineteen = "19"
+ show Twenty = "20"
+ show TwentyOne = "21"
+ show TwentyTwo = "22"
+ show TwentyThree = "23"
+ show TwentyFour = "24"
+ show TwentyFive = "25"
+ show TwentySix = "26"
+ show TwentySeven = "27"
+ show TwentyEight = "28"
+ show TwentyNine = "29"
+ show Thirty = "30"
+ show ThirtyOne = "31"
+ show ThirtyTwo = "32"
instance Arbitrary Maskbits where
- arbitrary = elements [ Zero,
- One,
- Two,
- Three,
- Four,
- Five,
- Six,
- Seven,
- Eight,
- Nine,
- Ten,
- Eleven,
- Twelve,
- Thirteen,
- Fourteen,
- Fifteen,
- Sixteen,
- Seventeen,
- Eighteen,
- Nineteen,
- Twenty,
- TwentyOne,
- TwentyTwo,
- TwentyThree,
- TwentyFour,
- TwentyFive,
- TwentySix,
- TwentySeven,
- TwentyEight,
- TwentyNine,
- Thirty,
- ThirtyOne,
- ThirtyTwo ]
+ arbitrary =
+ elements [ Zero,
+ One,
+ Two,
+ Three,
+ Four,
+ Five,
+ Six,
+ Seven,
+ Eight,
+ Nine,
+ Ten,
+ Eleven,
+ Twelve,
+ Thirteen,
+ Fourteen,
+ Fifteen,
+ Sixteen,
+ Seventeen,
+ Eighteen,
+ Nineteen,
+ Twenty,
+ TwentyOne,
+ TwentyTwo,
+ TwentyThree,
+ TwentyFour,
+ TwentyFive,
+ TwentySix,
+ TwentySeven,
+ TwentyEight,
+ TwentyNine,
+ Thirty,
+ ThirtyOne,
+ 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 -> Maskbits
-maskbits_from_int 0 = Zero
-maskbits_from_int 1 = One
-maskbits_from_int 2 = Two
-maskbits_from_int 3 = Three
-maskbits_from_int 4 = Four
-maskbits_from_int 5 = Five
-maskbits_from_int 6 = Six
-maskbits_from_int 7 = Seven
-maskbits_from_int 8 = Eight
-maskbits_from_int 9 = Nine
-maskbits_from_int 10 = Ten
-maskbits_from_int 11 = Eleven
-maskbits_from_int 12 = Twelve
-maskbits_from_int 13 = Thirteen
-maskbits_from_int 14 = Fourteen
-maskbits_from_int 15 = Fifteen
-maskbits_from_int 16 = Sixteen
-maskbits_from_int 17 = Seventeen
-maskbits_from_int 18 = Eighteen
-maskbits_from_int 19 = Nineteen
-maskbits_from_int 20 = Twenty
-maskbits_from_int 21 = TwentyOne
-maskbits_from_int 22 = TwentyTwo
-maskbits_from_int 23 = TwentyThree
-maskbits_from_int 24 = TwentyFour
-maskbits_from_int 25 = TwentyFive
-maskbits_from_int 26 = TwentySix
-maskbits_from_int 27 = TwentySeven
-maskbits_from_int 28 = TwentyEight
-maskbits_from_int 29 = TwentyNine
-maskbits_from_int 30 = Thirty
-maskbits_from_int 31 = ThirtyOne
-maskbits_from_int 32 = ThirtyTwo
-maskbits_from_int _ = None
+-- | 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
-maskbits_from_string :: String -> Maskbits
+-- | Convert a String to Maskbits, if possible.
+maskbits_from_string :: String -> Maybe Maskbits
maskbits_from_string s =
- case (reads s :: [(Int, String)]) of
- [] -> None
- x:_ -> maskbits_from_int (fst x)
+ 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 None = None
-decrement Zero = None
+decrement Zero = Zero
decrement One = Zero
decrement Two = One
decrement Three = Two