wordify 0.1.0.0 → 0.1.0.1
raw patch · 2 files changed
+61/−58 lines, 2 filesdep +bytestringdep +conduitdep +textPVP ok
version bump matches the API change (PVP)
Dependencies added: bytestring, conduit, text
API changes (from Hackage documentation)
Files
- src/Wordify/Rules/Dictionary.hs +57/−57
- wordify.cabal +4/−1
src/Wordify/Rules/Dictionary.hs view
@@ -1,66 +1,66 @@-module Wordify.Rules.Dictionary (Dictionary,- makeDictionary,- dictionaryFromWords,- isValidWord,- invalidWords- ) where-- import qualified Data.HashSet as HashSet- import Wordify.Rules.ScrabbleError- import qualified Control.Exception as Exc- import Text.ParserCombinators.Parsec- import Text.Parsec.Prim- import Data.Char- import Control.Monad- import Control.Arrow-- data Dictionary = Dictionary (HashSet.HashSet String) deriving Show-- {- | - Returns the list of words which are not present in the given dictionary from a - list of input words. - -}- invalidWords :: Dictionary -> [String] -> [String]- invalidWords dictionary = filter $ not . isValidWord dictionary+module Wordify.Rules.Dictionary+ ( Dictionary,+ makeDictionary,+ dictionaryFromWords,+ isValidWord,+ invalidWords,+ )+where - {-- Returns true if the given word is in the given dictionary.- -}- isValidWord :: Dictionary -> String -> Bool- isValidWord (Dictionary dictionaryWords) = flip HashSet.member dictionaryWords+import Conduit (MonadIO (liftIO), MonadResource, MonadUnliftIO, runResourceT)+import qualified Control.Applicative as M+import Control.Arrow+import qualified Control.Exception as Exc+import Control.Monad+import qualified Control.Monad.Trans.Accum as Co+import qualified Data.ByteString as BS+import Data.Char+import Data.Conduit+import qualified Data.Conduit.Combinators as Co+import qualified Data.Conduit.List as Cl+import qualified Data.Foldable as C+import qualified Data.HashSet as HashSet+import qualified Data.Text as T+import qualified Data.Text.Encoding as TE+import Text.Parsec.Prim+import Text.ParserCombinators.Parsec+import Wordify.Rules.ScrabbleError - dictionaryFromWords :: [String] -> Dictionary- dictionaryFromWords = Dictionary . HashSet.fromList . upperCaseWords +data Dictionary = Dictionary (HashSet.HashSet T.Text) deriving (Show) - {- |- Creates a dictionary from a file containing a list of valid words, each word being seperated by a newline.- -}- makeDictionary :: FilePath -> IO (Either ScrabbleError Dictionary)- makeDictionary filePath = join . fmap parseDictionary <$> readDictionaryFile filePath+-- |+-- Returns the list of words which are not present in the given dictionary from a+-- list of input words.+invalidWords :: Dictionary -> [String] -> [String]+invalidWords dictionary = filter $ not . isValidWord dictionary - readDictionaryFile :: FilePath -> IO (Either ScrabbleError String)- readDictionaryFile filePath = convertFileError <$> (Exc.try (readFile filePath) :: (IO (Either Exc.IOException String)))- where- convertFileError = left (\_ -> DictionaryFileNotFound filePath)+{-+ Returns true if the given word is in the given dictionary.+-}+isValidWord :: Dictionary -> String -> Bool+isValidWord (Dictionary dictionaryWords) word = HashSet.member (T.pack word) dictionaryWords - parseDictionary :: String -> Either ScrabbleError Dictionary- parseDictionary = either (Left . MalformedDictionaryFile . show) (Right . dictionaryFromWords) . parseFile- where- parseFile = parse dictionaryFile "" +dictionaryFromWords :: [String] -> Dictionary+dictionaryFromWords words = Dictionary . HashSet.fromList $ map T.pack (upperCaseWords words) - dictionaryFile = - do- dictWords <- many word- _ <- eof- return dictWords+sinkFileLinesToHashset :: (MonadResource m, MonadUnliftIO m) => FilePath -> ConduitT () Void m (HashSet.HashSet T.Text)+sinkFileLinesToHashset filePath =+ Co.sourceFile filePath .| Co.linesUnboundedAscii .| Cl.map (T.toUpper . TE.decodeUtf8) .| Co.foldl insertIntoHashet HashSet.empty+ where+ insertIntoHashet = flip HashSet.insert - word = - do- entry <- many letter :: Parser String- _ <- newline- return entry- - upperCaseWords :: [String] -> [String]- upperCaseWords = (map . map) toUpper+loadDictionaryFromFile :: FilePath -> IO Dictionary+loadDictionaryFromFile filePath = do+ hashset <- runResourceT $ runConduit $ sinkFileLinesToHashset filePath+ pure $ Dictionary hashset +-- |+-- Creates a dictionary from a file containing a list of valid words, each word being seperated by a newline.+makeDictionary :: FilePath -> IO (Either ScrabbleError Dictionary)+makeDictionary filePath = do+ convertFileError <$> (Exc.try (loadDictionaryFromFile filePath) :: (IO (Either Exc.IOException Dictionary)))+ where+ convertFileError = left (\_ -> DictionaryFileNotFound filePath) +upperCaseWords :: [String] -> [String]+upperCaseWords = (map . map) toUpper
wordify.cabal view
@@ -7,7 +7,7 @@ -- hash: f28111054d235bc18dc5e0d167dd433a32a9e0c4e9627cc10c02822b5b2ac44e name: wordify-version: 0.1.0.0+version: 0.1.0.1 description: Please see the README on GitHub at <https://github.com/githubuser/wordify#readme> category: Game homepage: https://github.com/happy0/wordify#readme@@ -62,6 +62,9 @@ , split , transformers , unordered-containers+ , conduit+ , text+ , bytestring default-language: Haskell2010 executable wordify-exe