]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Maskbits.hs
Update for QuickCheck 2.
[hath.git] / src / Maskbits.hs
index cb4ab8986b2bcd343540baa56dbda4a11e7d9dc6..06314e395f2043c12da778f81405203692e5ded2 100644 (file)
 module Maskbits
 ( Maskbits(..),
+  decrement,
   maskbits_from_string
 ) where
 
+import Test.QuickCheck
+
 -- A type representing the number of bits in a CIDR netmask.
-data Maskbits = None | Maskbits Int
-              deriving (Eq, Show)
+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)
+
+
+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"
+
+
+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 x | (x < 0) || (x > 32) = None
-                    | otherwise = Maskbits x
+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
 
 
 maskbits_from_string :: String -> Maskbits
@@ -20,3 +162,41 @@ maskbits_from_string s =
     case (reads s :: [(Int, String)]) of
       []   -> None
       x:_ -> maskbits_from_int (fst x)
+
+
+
+decrement :: Maskbits -> Maskbits
+decrement None = None
+decrement Zero = None
+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