+
+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 ]
+
+
+
+-- | 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