module Game.LambdaHack.Common.Misc
( makePhrase, makeSentence, squashedWWandW
, appDataDir
, xM, xD, minusM, minusM1, minusM2, oneM, tenthM
, show64With2
, workaroundOnMainThreadMVar
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Control.Concurrent
import qualified Data.Char as Char
import Data.Int (Int64)
import qualified Data.Map as M
import qualified NLP.Miniutter.English as MU
import System.Directory (getAppUserDataDirectory)
import System.Environment (getProgName)
import System.IO.Unsafe (unsafePerformIO)
makePhrase, makeSentence :: [MU.Part] -> Text
makePhrase = MU.makePhrase irregular
makeSentence = MU.makeSentence irregular
irregular :: MU.Irregular
irregular = MU.Irregular
{ irrPlural =
M.fromList
[ ("merchandise", "merchandise")
, ("Merchandise", "Merchandise") ]
`M.union` MU.irrPlural MU.defIrregular
, irrIndefinite = MU.irrIndefinite MU.defIrregular
}
squashedWWandW :: [MU.Part] -> (MU.Part, MU.Person)
squashedWWandW parts =
let repetitions = group parts
f [] = error $ "empty group" `showFailure` parts
f [part] = (part, MU.Sg3rd)
f l@(part : _) = (MU.CardinalWs (length l) part, MU.PlEtc)
cars = map f repetitions
person = case cars of
[] -> error $ "empty cars" `showFailure` parts
[(_, person1)] -> person1
_ -> MU.PlEtc
in (MU.WWandW $ map fst cars, person)
appDataDir :: IO FilePath
appDataDir = do
progName <- getProgName
let name = takeWhile Char.isAlphaNum progName
getAppUserDataDirectory name
xM :: Int -> Int64
xM k = fromIntegral k * 1000000
xD :: Double -> Double
xD k = k * 1000000
minusM, minusM1, minusM2, oneM, tenthM :: Int64
minusM = xM (-1)
minusM1 = xM (-1) - 1
minusM2 = xM (-1) - 2
oneM = xM 1
tenthM = 100000
show64With2 :: Int64 -> Text
show64With2 n =
let k = 100 * n `div` oneM
l = k `div` 100
x = k - l * 100
y = x `div` 10
in tshow l
<> if | x == 0 -> ""
| x == y * 10 -> "." <> tshow y
| x < 10 -> ".0" <> tshow x
| otherwise -> "." <> tshow x
workaroundOnMainThreadMVar :: MVar (IO ())
{-# NOINLINE workaroundOnMainThreadMVar #-}
workaroundOnMainThreadMVar = unsafePerformIO newEmptyMVar