]> gitweb.michael.orlitzky.com - email-validator.git/commitdiff
Add some comments.
authorMichael Orlitzky <michael@orlitzky.com>
Wed, 29 May 2013 20:07:31 +0000 (16:07 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Wed, 29 May 2013 20:07:31 +0000 (16:07 -0400)
src/Main.hs

index f38a7db4b3f5c1d60a2067c34d18c2af512e29ec..293f953ac8b82a5952d759ee85c1a07dab13ca61 100644 (file)
@@ -48,6 +48,8 @@ common_domains = map BSU.fromString [ "aol.com",
                                       "yahoo.com",
                                       "verizon.net" ]
 
+
+-- | Check whether the given domain has a valid MX record.
 validate_mx :: Resolver -> Domain -> IO Bool
 validate_mx resolver domain
   | domain `elem` common_domains = return True
@@ -111,6 +113,7 @@ validate resolver address = do
     return (address, False)
 
 
+-- | Append a ByteString to a file Handle, followed by a newline.
 append_handle_with_newline :: Handle -> BS.ByteString -> IO ()
 append_handle_with_newline h bs = do
   BS.hPutStr h bs
@@ -123,6 +126,8 @@ main :: IO ()
 main = do
   Args{..} <- apply_args
 
+  -- Get the input from either stdin, or the file given on the command
+  -- line.
   input <- case input_file of
              Nothing   -> BS.hGetContents stdin
              Just path -> do
@@ -131,19 +136,29 @@ main = do
                  exitWith (ExitFailure exit_input_file_doesnt_exist)
                BS.readFile path
 
+  -- Do the same for the output handle and stdout.
   output_handle <- case output_file of
                      Nothing -> return stdout
                      Just path -> openFile path WriteMode
 
+  -- Split the input into lines.
   let addresses = BSU.lines input
+
+  -- And remove the empty ones.
   let nonempty_addresses = filter (not . BS.null) addresses
 
   rs <- makeResolvSeed resolv_conf
   withResolver rs $ \resolver -> do
+    -- Construst a list of [IO (Address, Bool)]
     let actions = map (validate resolver) nonempty_addresses
+    -- And compute them in parallel.
     results <- parallel actions
     stopGlobalPool
+    -- Find the pairs with a True in the second position.
     let good_pairs = filter snd results
+    -- And output the results.
     mapM_ ((append_handle_with_newline output_handle) . fst) good_pairs
-    hFlush output_handle
-    hClose output_handle
+
+  -- Clean up. It's safe to try to close stdout.
+  hFlush output_handle
+  hClose output_handle