]> gitweb.michael.orlitzky.com - hath.git/blob - src/Maskbits.hs
Rewrite everything to use Maybe instead of None constructors.
[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 =
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 Zero = "0"
49 show One = "1"
50 show Two = "2"
51 show Three = "3"
52 show Four = "4"
53 show Five = "5"
54 show Six = "6"
55 show Seven = "7"
56 show Eight = "8"
57 show Nine = "9"
58 show Ten = "10"
59 show Eleven = "11"
60 show Twelve = "12"
61 show Thirteen = "13"
62 show Fourteen = "14"
63 show Fifteen = "15"
64 show Sixteen = "16"
65 show Seventeen = "17"
66 show Eighteen = "18"
67 show Nineteen = "19"
68 show Twenty = "20"
69 show TwentyOne = "21"
70 show TwentyTwo = "22"
71 show TwentyThree = "23"
72 show TwentyFour = "24"
73 show TwentyFive = "25"
74 show TwentySix = "26"
75 show TwentySeven = "27"
76 show TwentyEight = "28"
77 show TwentyNine = "29"
78 show Thirty = "30"
79 show ThirtyOne = "31"
80 show ThirtyTwo = "32"
81
82
83 instance Arbitrary Maskbits where
84 arbitrary =
85 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
120
121 -- | There are only 32 bits in an IPv4 address, so there
122 -- can't be more bits than that in the mask.
123 maskbits_from_int :: Int -> Maybe Maskbits
124 maskbits_from_int 0 = Just Zero
125 maskbits_from_int 1 = Just One
126 maskbits_from_int 2 = Just Two
127 maskbits_from_int 3 = Just Three
128 maskbits_from_int 4 = Just Four
129 maskbits_from_int 5 = Just Five
130 maskbits_from_int 6 = Just Six
131 maskbits_from_int 7 = Just Seven
132 maskbits_from_int 8 = Just Eight
133 maskbits_from_int 9 = Just Nine
134 maskbits_from_int 10 = Just Ten
135 maskbits_from_int 11 = Just Eleven
136 maskbits_from_int 12 = Just Twelve
137 maskbits_from_int 13 = Just Thirteen
138 maskbits_from_int 14 = Just Fourteen
139 maskbits_from_int 15 = Just Fifteen
140 maskbits_from_int 16 = Just Sixteen
141 maskbits_from_int 17 = Just Seventeen
142 maskbits_from_int 18 = Just Eighteen
143 maskbits_from_int 19 = Just Nineteen
144 maskbits_from_int 20 = Just Twenty
145 maskbits_from_int 21 = Just TwentyOne
146 maskbits_from_int 22 = Just TwentyTwo
147 maskbits_from_int 23 = Just TwentyThree
148 maskbits_from_int 24 = Just TwentyFour
149 maskbits_from_int 25 = Just TwentyFive
150 maskbits_from_int 26 = Just TwentySix
151 maskbits_from_int 27 = Just TwentySeven
152 maskbits_from_int 28 = Just TwentyEight
153 maskbits_from_int 29 = Just TwentyNine
154 maskbits_from_int 30 = Just Thirty
155 maskbits_from_int 31 = Just ThirtyOne
156 maskbits_from_int 32 = Just ThirtyTwo
157 maskbits_from_int _ = Nothing
158
159 maskbits_from_string :: String -> Maybe Maskbits
160 maskbits_from_string s =
161 case (reads s :: [(Int, String)]) of
162 [] -> Nothing
163 x:_ -> maskbits_from_int (fst x)
164
165
166
167 decrement :: Maskbits -> Maskbits
168 decrement Zero = Zero
169 decrement One = Zero
170 decrement Two = One
171 decrement Three = Two
172 decrement Four = Three
173 decrement Five = Four
174 decrement Six = Five
175 decrement Seven = Six
176 decrement Eight = Seven
177 decrement Nine = Eight
178 decrement Ten = Nine
179 decrement Eleven = Ten
180 decrement Twelve = Eleven
181 decrement Thirteen = Twelve
182 decrement Fourteen = Thirteen
183 decrement Fifteen = Fourteen
184 decrement Sixteen = Fifteen
185 decrement Seventeen = Sixteen
186 decrement Eighteen = Seventeen
187 decrement Nineteen = Eighteen
188 decrement Twenty = Nineteen
189 decrement TwentyOne = Twenty
190 decrement TwentyTwo = TwentyOne
191 decrement TwentyThree = TwentyTwo
192 decrement TwentyFour = TwentyThree
193 decrement TwentyFive = TwentyFour
194 decrement TwentySix = TwentyFive
195 decrement TwentySeven = TwentySix
196 decrement TwentyEight = TwentySeven
197 decrement TwentyNine = TwentyEight
198 decrement Thirty = TwentyNine
199 decrement ThirtyOne = Thirty
200 decrement ThirtyTwo = ThirtyOne