{-# LANGUAGE BangPatterns #-}
module Main (main) where
import Control.Monad (forM_, unless, when)
import System.Directory
import System.Environment (getArgs)
import System.Exit
import qualified Data.BloomFilter as B
main :: IO ()
main = do
files <- getArgs
when (null files) $ do
putStrLn "No files to spell"
exitSuccess
putStrLn $ "Spelling files: " ++ show files
hasDictionary <- doesFileExist "/usr/share/dict/words"
unless hasDictionary $ do
putStrLn "No dictionary found"
exitSuccess
dictionary <- readFile "/usr/share/dict/words"
let !bloom = B.fromList (B.policyForFPR 0.01) bSalt (words dictionary)
forM_ files $ \file ->
putStrLn . unlines . filter (`B.notElem` bloom) . words
=<< readFile file
bSalt :: B.Salt
bSalt = 4