]> gitweb.michael.orlitzky.com - hath.git/blobdiff - src/Cidr.hs
Bump the version number to 0.0.4 in hath.cabal.
[hath.git] / src / Cidr.hs
index d41ba11dc2b9eef533701a11c6011144641b6d82..e23ae6c1a55a2ba0e9c9de333cc4c8bbbb369453 100644 (file)
@@ -1,3 +1,5 @@
+-- | The CIDR modules contains most of the functions used for working
+--   with the CIDR type.
 module Cidr
 ( Cidr(..),
   cidr_from_string,
@@ -6,6 +8,7 @@ module Cidr
   combine_all,
   contains,
   contains_proper,
+  enumerate,
   max_octet1,
   max_octet2,
   max_octet3,
@@ -19,7 +22,8 @@ module Cidr
 ) where
 
 import Data.List (nubBy)
-import Data.Maybe (catMaybes, fromJust)
+import Data.List.Split (splitOneOf)
+import Data.Maybe (catMaybes, fromJust, mapMaybe)
 
 import Test.HUnit (assertEqual)
 import Test.Framework (Test, testGroup)
@@ -29,7 +33,6 @@ import Test.QuickCheck (Arbitrary(..), Gen, Property, (==>))
 
 import qualified Bit as B
 import IPv4Address
-import ListUtils
 import Maskable
 import Maskbits
 import Octet
@@ -55,27 +58,27 @@ instance Eq Cidr where
   cidr1 == cidr2 = (cidr1 `equivalent` cidr2)
 
 
--- Two CIDR ranges are equivalent if they have the same network bits
--- and the masks are the same.
+-- Two CIDR ranges are equivalent if they have the same network bits
+--   and the masks are the same.
 equivalent :: Cidr -> Cidr -> Bool
 equivalent (Cidr addr1 mbits1) (Cidr addr2 mbits2) =
     (mbits1 == mbits2) && ((apply_mask addr1 mbits1 B.Zero) == (apply_mask addr2 mbits2 B.Zero))
 
--- Returns the mask portion of a CIDR address. That is, everything
--- after the trailing slash.
+-- Returns the mask portion of a CIDR address. That is, everything
+--   after the trailing slash.
 maskbits_from_cidr_string :: String -> Maybe Maskbits
 maskbits_from_cidr_string s
   | length partlist == 2 = maskbits_from_string (partlist !! 1)
   | otherwise = Nothing
     where
-      partlist = (splitWith (`elem` "/") s)
+      partlist = splitOneOf "/" s
 
 
 -- | Takes an IP address String in CIDR notation, and returns a list
 --   of its octets (as Ints).
 octets_from_cidr_string :: String -> [Octet]
 octets_from_cidr_string s =
-  catMaybes $ map octet_from_string (take 4 (splitWith (`elem` "./") s))
+  mapMaybe octet_from_string (take 4 (splitOneOf "./" s))
 
 
 -- | Return Nothing if we can't parse both maskbits and octets from
@@ -92,35 +95,53 @@ cidr_from_string s =
 
 
 
+-- | Given a CIDR, return the minimum valid IPv4 address contained
+--   within it.
 min_host :: Cidr -> IPv4Address
 min_host (Cidr addr mask) = apply_mask addr mask B.Zero
 
-
+-- | Given a CIDR, return the maximum valid IPv4 address contained
+--   within it.
 max_host :: Cidr -> IPv4Address
 max_host (Cidr addr mask) = apply_mask addr mask B.One
 
-
+-- | Given a CIDR, return the first octet of the minimum valid IPv4
+--   address contained within it.
 min_octet1 :: Cidr -> Octet
 min_octet1 cidr = octet1 (min_host cidr)
 
+-- | Given a CIDR, return the second octet of the minimum valid IPv4
+--   address contained within it.
 min_octet2 :: Cidr -> Octet
 min_octet2 cidr = octet2 (min_host cidr)
 
+-- | Given a CIDR, return the third octet of the minimum valid IPv4
+--   address contained within it.
 min_octet3 :: Cidr -> Octet
 min_octet3 cidr = octet3 (min_host cidr)
 
+-- | Given a CIDR, return the fourth octet of the minimum valid IPv4
+--   address contained within it.
 min_octet4 :: Cidr -> Octet
 min_octet4 cidr = octet4 (min_host cidr)
 
+-- | Given a CIDR, return the first octet of the maximum valid IPv4
+--   address contained within it.
 max_octet1 :: Cidr -> Octet
 max_octet1 cidr = octet1 (max_host cidr)
 
+-- | Given a CIDR, return the second octet of the maximum valid IPv4
+--   address contained within it.
 max_octet2 :: Cidr -> Octet
 max_octet2 cidr = octet2 (max_host cidr)
 
+-- | Given a CIDR, return the third octet of the maximum valid IPv4
+--   address contained within it.
 max_octet3 :: Cidr -> Octet
 max_octet3 cidr = octet3 (max_host cidr)
 
+-- | Given a CIDR, return the fourth octet of the maximum valid IPv4
+--   address contained within it.
 max_octet4 :: Cidr -> Octet
 max_octet4 cidr = octet4 (max_host cidr)
 
@@ -145,7 +166,7 @@ max_octet4 cidr = octet4 (max_host cidr)
 --   cidr1, then at least mbits1 of an address in cidr2 will match
 --   cidr1. For example,
 --
---   cidr1 = 192.168.1.0/23, cidr2 = 192.168.1.100/24
+--   cidr1 = 192.168.1.0\/23, cidr2 = 192.168.1.100\/24
 --
 --   Here, cidr2 contains all of 192.168.1.0 through
 --   192.168.1.255. However, cidr1 contains BOTH 192.168.0.0 through
@@ -167,6 +188,7 @@ contains (Cidr addr1 mbits1) (Cidr addr2 mbits2)
     addr2masked = apply_mask addr2 mbits1 B.Zero
 
 
+-- | Contains but is not equal to.
 contains_proper :: Cidr -> Cidr -> Bool
 contains_proper cidr1 cidr2 =
     (cidr1 `contains` cidr2) && (not (cidr2 `contains` cidr1))
@@ -233,7 +255,8 @@ adjacent cidr1 cidr2
     mbits2 = maskbits cidr2
 
 
-
+enumerate :: Cidr -> [IPv4Address]
+enumerate cidr = [(min_host cidr)..(max_host cidr)]
 
 
 -- HUnit Tests