packages feed

Verba-0.1.0.1: src/Verba/Dictionary.hs

module Verba.Dictionary where

import Data.Map (Map)
import Data.Maybe (fromMaybe)
import qualified Data.Map as Map
import System.IO

type Dictionary = Map Int [String]

-- Pushes a word in the right bucket
-- based on its length.
insertWord :: String -> Dictionary -> Dictionary
insertWord w = Map.alter fn (length w)
    where fn Nothing = Just []
          fn (Just lst) = Just $ w : lst

-- Loads the dictionary so that only words up to
-- the specified length are loaded.
load :: Int -> FilePath -> IO Dictionary
load n file = withFile file ReadMode $ (\handle -> do
    hSetEncoding handle latin1
    contents <- hGetContents handle
    let wordList = takeWhile ((<= n) . length) $ words contents
    return $! foldr insertWord Map.empty wordList)

-- Gets all the words with a certain length.
wordsWithLength :: Int -> Dictionary -> [String]
wordsWithLength n = fromMaybe [] . Map.lookup n