cake3-0.1.0.0: src/Development/Cake3/Types.hs
module Development.Cake3.Types where
import Data.Monoid
import qualified Data.List as L
import Data.List hiding(foldr)
import qualified Data.Map as M
import Data.Map (Map)
import qualified Data.Set as S
import Data.Set (Set)
import System.FilePath.Wrapper
-- | Item wich have it's position in the Makefile. Positioned adds the metric to
-- the contained datatype. Note, that the metric is not the subject of Eq or
-- Ord. mappend-ing two metrics results in taking the minimal one.
-- data Pos a = Pos { ppos :: Int, pwhat :: a }
-- deriving(Show, Eq)
-- instance Ord a => Ord (Pos a) where
-- compare (Pos p w) (Pos p2 w2) =
-- case p`compare`p2 of
-- EQ -> w`compare`w2
-- x -> x
-- instance Monoid a => Monoid (Pos a) where
-- mempty = Pos 0 mempty
-- mappend (Pos a ad) (Pos b bd) = Pos (min a b) (mappend ad bd)
-- -- higher positions go first
-- cmpPos (Pos a _) (Pos b _) = a`compare`b
-- unposition (Pos _ x) = x
-- | Makefile variable
data Variable = Variable {
vname :: String
, vval :: Maybe String
-- ^ Nothing means that variable is defined elsewhere (eg. borrowed from the
-- environment)
} deriving(Show, Eq, Ord)
type Vars = Map String (Set Variable)
-- | Command represents OS command line and consists of a list of fragments.
-- Each fragment is either text (may contain spaces) or FilePath (spaces should
-- be escaped)
type Command = [Either String File]
return_text x = return [Left x]
return_file x = return [Right x]
-- | Recipe answers to the question 'How to build the targets'
data RecipeT v = Recipe {
rtgt :: Set File
-- ^ Targets
, rsrc :: Set File
-- ^ Prerequisites
, rcmd :: [Command]
-- ^ A list of shell commands
, rvars :: v
-- ^ Container of variables
, rloc :: String
-- FIXME: actually, PHONY is a file's attribute, not recipe's
, rphony :: Bool
} deriving(Show, Eq, Ord)