]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Maskbits.hs
Add more Haddock comments.
[hath.git] / src / Maskbits.hs
index fcf57bdb379760ba2349bf2815e13aa62425085b..ac46ccf96a316a3233e961d9e00d637c95c3d11b 100644 (file)
 module Maskbits
 ( Maskbits(..),
+  decrement,
   maskbits_from_string
 ) where
 
--- 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)
+import Test.QuickCheck
+
+-- | 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 ]
 
 
 
--- 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 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