summaryrefslogtreecommitdiff
path: root/src/Sequence/Utils.hs
blob: 7d28b83a91b0fbc768044f49292520605deb1603 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{-# LANGUAGE ViewPatterns, FlexibleContexts, MultiParamTypeClasses #-}

module Sequence.Utils
  ( toName, fromName
  ) where

import Sequence.Types

import Control.Monad.State.Strict

import Control.Lens

import Data.Bimap (Bimap)
import qualified Data.Bimap as Bimap

import Data.CaseInsensitive (CI)
import qualified Data.CaseInsensitive as CI

import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map

import Data.Function
import Data.Default
import Data.Maybe
import Text.Read

import Data.List

import System.Console.Shell

unaligned = view faction' def
  
toName :: MonadState GameState m => EntityIdentifier -> m String
toName id = fromMaybe (show $ id ^. entityId) . fmap (CI.original . view entityName) . Bimap.lookup id <$> use gEntityNames

fromName :: MonadState GameState m => String -> m (Maybe EntityIdentifier)
fromName (readMaybe -> n@(Just _)) = return $ EntityIdentifier <$> n
fromName (EntityName . CI.mk -> name) = Bimap.lookupR name <$> use gEntityNames

instance Completion EntityIdentifier GameState where
  completableLabel _ = "<entity>"
  complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . map ((evalState ?? st) . toName) . Map.keys $ st ^. gEntities

instance Completion Faction GameState where
  completableLabel _ = "<faction>"
  complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . nub . sort $ unaligned : map (view faction') (st ^. inhabitedFactions)