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