]> gitweb.michael.orlitzky.com - hath.git/blob - src/Maskbits.hs
59efc2d2e6d61454d55abcf7d88f7c5a782f2542
[hath.git] / src / Maskbits.hs
1 module Maskbits
2 ( Maskbits(..),
3 decrement,
4 maskbits_from_string
5 ) where
6
7 import Test.QuickCheck
8
9 -- A type representing the number of bits in a CIDR netmask.
10 data Maskbits = None
11 | Zero
12 | One
13 | Two
14 | Three
15 | Four
16 | Five
17 | Six
18 | Seven
19 | Eight
20 | Nine
21 | Ten
22 | Eleven
23 | Twelve
24 | Thirteen
25 | Fourteen
26 | Fifteen
27 | Sixteen
28 | Seventeen
29 | Eighteen
30 | Nineteen
31 | Twenty
32 | TwentyOne
33 | TwentyTwo
34 | TwentyThree
35 | TwentyFour
36 | TwentyFive
37 | TwentySix
38 | TwentySeven
39 | TwentyEight
40 | TwentyNine
41 | Thirty
42 | ThirtyOne
43 | ThirtyTwo
44 deriving (Eq, Ord)
45
46
47 instance Show Maskbits where
48 show None = "None"
49 show Zero = "0"
50 show One = "1"
51 show Two = "2"
52 show Three = "3"
53 show Four = "4"
54 show Five = "5"
55 show Six = "6"
56 show Seven = "7"
57 show Eight = "8"
58 show Nine = "9"
59 show Ten = "10"
60 show Eleven = "11"
61 show Twelve = "12"
62 show Thirteen = "13"
63 show Fourteen = "14"
64 show Fifteen = "15"
65 show Sixteen = "16"
66 show Seventeen = "17"
67 show Eighteen = "18"
68 show Nineteen = "19"
69 show Twenty = "20"
70 show TwentyOne = "21"
71 show TwentyTwo = "22"
72 show TwentyThree = "23"
73 show TwentyFour = "24"
74 show TwentyFive = "25"
75 show TwentySix = "26"
76 show TwentySeven = "27"
77 show TwentyEight = "28"
78 show TwentyNine = "29"
79 show Thirty = "30"
80 show ThirtyOne = "31"
81 show ThirtyTwo = "32"
82
83
84 instance Arbitrary Maskbits where
85 arbitrary = elements [ Zero,
86 One,
87 Two,
88 Three,
89 Four,
90 Five,
91 Six,
92 Seven,
93 Eight,
94 Nine,
95 Ten,
96 Eleven,
97 Twelve,
98 Thirteen,
99 Fourteen,
100 Fifteen,
101 Sixteen,
102 Seventeen,
103 Eighteen,
104 Nineteen,
105 Twenty,
106 TwentyOne,
107 TwentyTwo,
108 TwentyThree,
109 TwentyFour,
110 TwentyFive,
111 TwentySix,
112 TwentySeven,
113 TwentyEight,
114 TwentyNine,
115 Thirty,
116 ThirtyOne,
117 ThirtyTwo ]
118
119 coarbitrary _ = variant 0
120
121
122
123 -- There are only 32 bits in an IPv4 address, so there
124 -- can't be more bits than that in the mask.
125 maskbits_from_int :: Int -> Maskbits
126 maskbits_from_int 0 = Zero
127 maskbits_from_int 1 = One
128 maskbits_from_int 2 = Two
129 maskbits_from_int 3 = Three
130 maskbits_from_int 4 = Four
131 maskbits_from_int 5 = Five
132 maskbits_from_int 6 = Six
133 maskbits_from_int 7 = Seven
134 maskbits_from_int 8 = Eight
135 maskbits_from_int 9 = Nine
136 maskbits_from_int 10 = Ten
137 maskbits_from_int 11 = Eleven
138 maskbits_from_int 12 = Twelve
139 maskbits_from_int 13 = Thirteen
140 maskbits_from_int 14 = Fourteen
141 maskbits_from_int 15 = Fifteen
142 maskbits_from_int 16 = Sixteen
143 maskbits_from_int 17 = Seventeen
144 maskbits_from_int 18 = Eighteen
145 maskbits_from_int 19 = Nineteen
146 maskbits_from_int 20 = Twenty
147 maskbits_from_int 21 = TwentyOne
148 maskbits_from_int 22 = TwentyTwo
149 maskbits_from_int 23 = TwentyThree
150 maskbits_from_int 24 = TwentyFour
151 maskbits_from_int 25 = TwentyFive
152 maskbits_from_int 26 = TwentySix
153 maskbits_from_int 27 = TwentySeven
154 maskbits_from_int 28 = TwentyEight
155 maskbits_from_int 29 = TwentyNine
156 maskbits_from_int 30 = Thirty
157 maskbits_from_int 31 = ThirtyOne
158 maskbits_from_int 32 = ThirtyTwo
159 maskbits_from_int _ = None
160
161
162 maskbits_from_string :: String -> Maskbits
163 maskbits_from_string s =
164 case (reads s :: [(Int, String)]) of
165 [] -> None
166 x:_ -> maskbits_from_int (fst x)
167
168
169
170 decrement :: Maskbits -> Maskbits
171 decrement None = None
172 decrement Zero = None
173 decrement One = Zero
174 decrement Two = One
175 decrement Three = Two
176 decrement Four = Three
177 decrement Five = Four
178 decrement Six = Five
179 decrement Seven = Six
180 decrement Eight = Seven
181 decrement Nine = Eight
182 decrement Ten = Nine
183 decrement Eleven = Ten
184 decrement Twelve = Eleven
185 decrement Thirteen = Twelve
186 decrement Fourteen = Thirteen
187 decrement Fifteen = Fourteen
188 decrement Sixteen = Fifteen
189 decrement Seventeen = Sixteen
190 decrement Eighteen = Seventeen
191 decrement Nineteen = Eighteen
192 decrement Twenty = Nineteen
193 decrement TwentyOne = Twenty
194 decrement TwentyTwo = TwentyOne
195 decrement TwentyThree = TwentyTwo
196 decrement TwentyFour = TwentyThree
197 decrement TwentyFive = TwentyFour
198 decrement TwentySix = TwentyFive
199 decrement TwentySeven = TwentySix
200 decrement TwentyEight = TwentySeven
201 decrement TwentyNine = TwentyEight
202 decrement Thirty = TwentyNine
203 decrement ThirtyOne = Thirty
204 decrement ThirtyTwo = ThirtyOne