]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/IPv4Address.hs
Added a new Maskable typeclass with instances Octet and IPv4Address.
[hath.git] / src / IPv4Address.hs
index 3d6b1bbc2980107ae15d3d9da3ccd521b5cd2c9c..01bf36e63126ef51ebb8aae4aec301a8db97c43b 100644 (file)
@@ -1,19 +1,48 @@
-module IPv4Address where
+module IPv4Address
+( ipv4address_from_octets,
+  IPv4Address(None),
+  max_octet1,
+  max_octet2,
+  max_octet3,
+  max_octet4,
+  min_octet1,
+  min_octet2,
+  min_octet3,
+  min_octet4,
+  octet1,
+  octet2,
+  octet3,
+  octet4
+)
+  where
 
 import Bit
+import Maskbits
 import Octet
 
-type Maskbits = Int
-
-data IPv4Address = IPv4Address { octet1 :: Octet,
-                                 octet2 :: Octet,
-                                 octet3 :: Octet,
-                                 octet4 :: Octet }
+data IPv4Address = None | IPv4Address { octet1 :: Octet,
+                                        octet2 :: Octet,
+                                        octet3 :: Octet,
+                                        octet4 :: Octet }
                  deriving (Eq, Show)
 
 
+-- We don't export our constructor so this function is the only
+-- way to construct an address from octets. As a result, we can
+-- return IPv4Address.None in response to being passed one of more
+-- Octet.None octets.
+ipv4address_from_octets :: Octet -> Octet -> Octet -> Octet -> IPv4Address
+ipv4address_from_octets oct1 oct2 oct3 oct4
+    | or [oct1 == Octet.None,
+          oct2 == Octet.None,
+          oct3 == Octet.None,
+          oct4 == Octet.None] = IPv4Address.None
+    | otherwise = IPv4Address oct1 oct2 oct3 oct4
+
+
 min_address :: IPv4Address -> Maskbits -> IPv4Address
-min_address addr mask
+min_address _ Maskbits.None = IPv4Address.None
+min_address addr (Maskbits mask)
     | mask == 32 = IPv4Address oct1 oct2 oct3 oct4
     | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 Zero)
     | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 Zero Zero)
@@ -85,7 +114,8 @@ min_address addr mask
 
 
 max_address :: IPv4Address -> Maskbits -> IPv4Address
-max_address addr mask
+max_address _ Maskbits.None = IPv4Address.None
+max_address addr (Maskbits mask)
     | mask == 32 = IPv4Address oct1 oct2 oct3 oct4
     | mask == 31 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 a31 One)
     | mask == 30 = IPv4Address oct1 oct2 oct3 (Octet a25 a26 a27 a28 a29 a30 One One)