module System.Nemesis.Type where
import Control.Lens
import Control.Monad.State (StateT)
import Data.Function (on)
import Data.List (intercalate)
import Data.Map (Map)
import Prelude hiding (())
newtype ShowIO = ShowIO {unShowIO :: IO () }
instance Show ShowIO where
show _ = "IO"
data Task = Task
{
_name :: String
, _action :: ShowIO
, _deps :: [String]
, _description :: Maybe String
, _namespace :: [String]
}
deriving (Show)
emptyTask :: Task
emptyTask = Task mempty (ShowIO (pure ())) mempty mempty mempty
makeLenses ''Task
data Nemesis = Nemesis
{
_tasks :: Map String Task
, _target :: String
, _currentDesc :: Maybe String
, _currentNamespace :: [String]
}
deriving (Show)
emptyNemesis :: Nemesis
emptyNemesis = Nemesis mempty mempty mempty mempty
makeLenses ''Nemesis
instance Eq Task where
(==) = (==) `on` (view name)
fullName :: Task -> String
fullName t = intercalate "/" . reverse $ (t ^. name : t ^. namespace)
instance Ord Task where
compare = compare `on` fullName
type Unit = StateT Nemesis IO ()