module Development.Hake.Types (
  Rule
, RuleInner
, Targets
, Sources
, Commands

, TargetRet	-- for Unit Test
, SourcesRet	-- for Unit Test
, CommandIO
, CommandRet
, RuleRet

, MadeFromList

, ruleToRuleInner
, ruleRetToMadeFromList
, getSrcs
, getUpdateStatus
) where

import Control.Monad.Reader (ReaderT, asks)

type Targets   = String -> Bool
type Sources   = String -> SourcesRet
type Commands  = String -> [ String ] -> CommandRet
type Rule      = ( Targets, Sources, Commands )
type RuleInner = ( Targets, (Sources, Commands) )

type TargetRet   = String
type SourcesRet  = [ String ]
type CommandIO   = ReaderT (Bool, MadeFromList) IO
type CommandRet  = CommandIO ()
type RuleRet     = ( TargetRet, (SourcesRet, CommandRet) )

type MadeFromList = [ (FilePath, [FilePath]) ]

getSrcs :: FilePath -> CommandIO [FilePath]
getSrcs fp = asks (maybe [] id . lookup fp . snd)

getUpdateStatus :: CommandIO Bool
getUpdateStatus = asks fst

ruleToRuleInner :: Rule -> RuleInner
ruleToRuleInner ( t, s, c ) = ( t, (s, c) )

ruleRetToMadeFromList :: [ RuleRet ] -> MadeFromList
ruleRetToMadeFromList = map (\(t, (s, _)) -> (t, s))