df-actors/app/Main.hs

71 lines
2.1 KiB
Haskell
Raw Normal View History

2022-12-25 00:37:33 +00:00
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE LambdaCase #-}
module Main where
import Control.Monad
import Data.Function
import Data.Map as M
import Data.Maybe
import Data.Text (Text)
import System.FilePath
import System.Directory
import Text.EscapeArtist
import qualified Data.Text as T
import qualified Data.Text.IO as T
import qualified Data.List as L
import qualified Debug.Trace as D
type Language = Text
type Dictionary = Map Text Text
main :: IO ()
main = do
dicts <- getLanguageData
mainLoop dicts
mainLoop :: Map Language Dictionary -> IO ()
mainLoop d = do
putStrLn "Name to look up (q to quit)?"
T.getLine >>= \case
"q" -> return ()
name -> do
forM_ (keys d) $ \language -> do
putEscLn $ Default ("Results in language: "::Text) <> colorLang language language
mapM_ (putEscLn . colorLang language) $ search (d!language) name
mainLoop d
colorLang :: Text -> Text -> Escapable
colorLang "dwarf" = FgGreen
colorLang "elf" = FgRed
colorLang "goblin" = FgYellow
colorLang "human" = FgBlue
colorLang _ = Default
search :: Dictionary -> Text -> [Text]
search _ "" = [""]
search d name = let prefixes = L.filter (`T.isPrefixOf` name) $ keys d
2022-12-25 00:53:06 +00:00
in if L.null prefixes then
[" - NO PERFECT MACTH ('"<>name<>"' left over from input)"]
else
[(d!p) <> s | p <- prefixes, s <- search d (T.drop (T.length p) name)]
2022-12-25 00:37:33 +00:00
getLanguageData :: IO (Map Language Dictionary)
getLanguageData = do
files <- listDirectory "data"
dicts <- forM files $ \fn ->
case takeExtension fn of
".raw" -> do
words <- fmap extractWord . L.filter ("T_WORD" `T.isInfixOf`) . T.lines <$> T.readFile ("data" </> fn)
return $ Just (T.pack $ takeBaseName fn, fromList words)
_ -> return Nothing
return $ fromList $ catMaybes dicts
extractWord :: Text -> (Text, Text)
extractWord = (\x -> (T.toLower $ x!!1,x!!2))
. T.splitOn ":"
. T.dropEnd 1
. T.dropWhileEnd (/=']')
. T.drop 1
. T.dropWhile (/='[')