packages feed

unscramble-0.1: Main.hs

import Control.Lens hiding ((&), value)
import Data.List
import Data.Maybe
import Data.Ord
import Options.Applicative
import Paths_unscramble
import System.IO
import Unscramble.Input
import Unscramble.Output
import Unscramble.Score
import Unscramble.Search
import Unscramble.Types

parseOpts :: Parser ScrambleOpts
parseOpts = ScrambleOpts
        <$> option
            ( long "size" 
            & short 's'
            & metavar "SIZE"
            & help "Grid size (default 4)"
            & value 4)
        <*> option
            ( long "score"
            & metavar "SYSTEM"
            & help "Scoring system (one of \27[1mswf\27[0m (default),\
            \ \27[1mboggle\27[0m, \27[1mword-wars\27[0m)"
            & value SWF)
        <*> option
            ( long "display"
            & short 'd'
            & metavar "STYLE"
            & help "Display style: \27[1mone-line\27[0m to print all\
            \ the words in order on one line, or \27[1mchunked\27[0m\
            \ to display three-at-a-time with a board diagram for each."
            & value Chunked)

main :: IO ()
main = do
    sopts <- execParser opts
    grid' <- readGrid (gridSize sopts)
    mult' <- case scoreSystem sopts of
        SWF -> readMult
        _ -> return $ Multiplier [] Nothing [] Nothing
    filepath <- getDataFileName "lists/enable.txt"
    withFile filepath ReadMode $ \h -> do
        cont <- hGetContents h
        let foundWords = sortBy ((invert .) . comparing (_1 ^$))
                       . mapMaybe (\a ->
                           searchGrid a grid' mult' (scoreSystem sopts))
                       $ lines cont
        display foundWords grid' mult' sopts
    where
        opts = info (helper <*> parseOpts)
            ( fullDesc
            & progDesc "Solve a Boggle-like word game"
            & header "unscramble")
        invert LT = GT
        invert GT = LT
        invert x = x