diff options
| -rw-r--r-- | src/Main.hs | 7 | ||||
| -rw-r--r-- | src/Sequence/Utils.hs | 24 |
2 files changed, 26 insertions, 5 deletions
diff --git a/src/Main.hs b/src/Main.hs index 639673c..903da05 100644 --- a/src/Main.hs +++ b/src/Main.hs | |||
| @@ -46,6 +46,7 @@ main = do | |||
| 46 | , cmd "factions" listFactions "List all inhabited factions" | 46 | , cmd "factions" listFactions "List all inhabited factions" |
| 47 | , cmd "members" listFaction "List all members of a faction" | 47 | , cmd "members" listFaction "List all members of a faction" |
| 48 | , cmd "entities" listEntities "List all entities" | 48 | , cmd "entities" listEntities "List all entities" |
| 49 | , cmd "align" alignEntity "Align an entity to a faction creating it, if necessary" | ||
| 49 | ] | 50 | ] |
| 50 | } | 51 | } |
| 51 | void $ runShell description haskelineBackend (def :: GameState) | 52 | void $ runShell description haskelineBackend (def :: GameState) |
| @@ -68,10 +69,14 @@ stateOutline st | |||
| 68 | return . colsAllG top $ [show (seqVal' ^. seqVal)] : map factionColumn [0..(length factions - 1)] | 69 | return . colsAllG top $ [show (seqVal' ^. seqVal)] : map factionColumn [0..(length factions - 1)] |
| 69 | 70 | ||
| 70 | listFaction :: Completable Faction -> Sh GameState () | 71 | listFaction :: Completable Faction -> Sh GameState () |
| 71 | listFaction (Completable (flip (set faction') def -> qFaction)) = use gEntities >>= mapM_ (shellPutStrLn <=< toName) . Map.keys . Map.filter ((==) qFaction . view eFaction) | 72 | listFaction = withArg $ \qFaction -> use gEntities >>= mapM_ (shellPutStrLn <=< toName) . Map.keys . Map.filter ((==) qFaction . view eFaction) |
| 72 | 73 | ||
| 73 | listFactions :: Sh GameState () | 74 | listFactions :: Sh GameState () |
| 74 | listFactions = use inhabitedFactions >>= mapM_ (shellPutStrLn . view faction') | 75 | listFactions = use inhabitedFactions >>= mapM_ (shellPutStrLn . view faction') |
| 75 | 76 | ||
| 76 | listEntities :: Sh GameState () | 77 | listEntities :: Sh GameState () |
| 77 | listEntities = use (gEntities . to Map.keys) >>= mapM_ (shellPutStrLn <=< toName) | 78 | listEntities = use (gEntities . to Map.keys) >>= mapM_ (shellPutStrLn <=< toName) |
| 79 | |||
| 80 | alignEntity :: Completable EntityIdentifier -> Completable Faction -> Sh GameState () | ||
| 81 | alignEntity ident' nFaction' = flip withArg nFaction' $ \nFaction -> flip withArg ident' $ \ident -> do | ||
| 82 | gEntities %= Map.adjust (set eFaction nFaction) ident | ||
diff --git a/src/Sequence/Utils.hs b/src/Sequence/Utils.hs index 7d28b83..aa92081 100644 --- a/src/Sequence/Utils.hs +++ b/src/Sequence/Utils.hs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | {-# LANGUAGE ViewPatterns, FlexibleContexts, MultiParamTypeClasses #-} | 1 | {-# LANGUAGE ViewPatterns, FlexibleContexts, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-} |
| 2 | 2 | ||
| 3 | module Sequence.Utils | 3 | module Sequence.Utils |
| 4 | ( toName, fromName | 4 | ( withArg, toName, fromName |
| 5 | ) where | 5 | ) where |
| 6 | 6 | ||
| 7 | import Sequence.Types | 7 | import Sequence.Types |
| @@ -22,11 +22,21 @@ import qualified Data.Map.Strict as Map | |||
| 22 | import Data.Function | 22 | import Data.Function |
| 23 | import Data.Default | 23 | import Data.Default |
| 24 | import Data.Maybe | 24 | import Data.Maybe |
| 25 | import Text.Read | 25 | import Text.Read (readMaybe) |
| 26 | 26 | ||
| 27 | import Data.List | 27 | import Data.List |
| 28 | 28 | ||
| 29 | import System.Console.Shell | 29 | import System.Console.Shell |
| 30 | import System.Console.Shell.ShellMonad | ||
| 31 | |||
| 32 | |||
| 33 | class Argument a st | a -> st where | ||
| 34 | arg :: String -> Sh st (Maybe a) | ||
| 35 | |||
| 36 | withArg :: Argument a st => (a -> Sh st ()) -> (Completable a -> Sh st ()) | ||
| 37 | withArg f (Completable str) = arg str >>= \a -> case a of | ||
| 38 | Nothing -> shellPutErrLn $ "Could not parse ‘" ++ str ++ "’" | ||
| 39 | Just a -> f a | ||
| 30 | 40 | ||
| 31 | unaligned = view faction' def | 41 | unaligned = view faction' def |
| 32 | 42 | ||
| @@ -34,13 +44,19 @@ toName :: MonadState GameState m => EntityIdentifier -> m String | |||
| 34 | toName id = fromMaybe (show $ id ^. entityId) . fmap (CI.original . view entityName) . Bimap.lookup id <$> use gEntityNames | 44 | toName id = fromMaybe (show $ id ^. entityId) . fmap (CI.original . view entityName) . Bimap.lookup id <$> use gEntityNames |
| 35 | 45 | ||
| 36 | fromName :: MonadState GameState m => String -> m (Maybe EntityIdentifier) | 46 | fromName :: MonadState GameState m => String -> m (Maybe EntityIdentifier) |
| 37 | fromName (readMaybe -> n@(Just _)) = return $ EntityIdentifier <$> n | 47 | fromName (readMaybe -> (Just (EntityIdentifier -> n))) = (n <$) . guard . Map.member n <$> use gEntities |
| 38 | fromName (EntityName . CI.mk -> name) = Bimap.lookupR name <$> use gEntityNames | 48 | fromName (EntityName . CI.mk -> name) = Bimap.lookupR name <$> use gEntityNames |
| 39 | 49 | ||
| 40 | instance Completion EntityIdentifier GameState where | 50 | instance Completion EntityIdentifier GameState where |
| 41 | completableLabel _ = "<entity>" | 51 | completableLabel _ = "<entity>" |
| 42 | complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . map ((evalState ?? st) . toName) . Map.keys $ st ^. gEntities | 52 | complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . map ((evalState ?? st) . toName) . Map.keys $ st ^. gEntities |
| 43 | 53 | ||
| 54 | instance Argument EntityIdentifier GameState where | ||
| 55 | arg = fromName | ||
| 56 | |||
| 44 | instance Completion Faction GameState where | 57 | instance Completion Faction GameState where |
| 45 | completableLabel _ = "<faction>" | 58 | completableLabel _ = "<faction>" |
| 46 | complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . nub . sort $ unaligned : map (view faction') (st ^. inhabitedFactions) | 59 | complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . nub . sort $ unaligned : map (view faction') (st ^. inhabitedFactions) |
| 60 | |||
| 61 | instance Argument Faction GameState where | ||
| 62 | arg = return . Just . flip (set faction') def | ||
