module Support.Transform where

data TransformParms p = TransformParms {
    transformIterate :: Iterate,
    transformDumpProgress :: Bool,
    transformSkipNoStats  :: Bool,
    transformOperation :: p -> IO p,
    transformCategory :: String,   -- ^ general name of transformation
    transformPass :: String,       -- ^ what pass we are in
    transformName :: String        -- ^ name of what we are working on
    }

transformParms :: TransformParms p
transformParms = TransformParms {
    transformIterate = DontIterate,
    transformDumpProgress = False,
    transformSkipNoStats = False,
    transformCategory = "Unknown",
    transformPass = "",
    transformOperation = return,
    transformName = ""
    }

data Iterate = DontIterate | IterateMax !Int | IterateExactly !Int | IterateDone
    deriving(Eq)

doIterate :: Iterate -> Bool -> Bool
doIterate IterateMax {}     True = True
doIterate IterateDone       True = True
doIterate IterateExactly {} _    = True
doIterate _ _ = False

iterateStep :: Iterate -> Iterate
iterateStep (IterateMax n) = IterateMax (n - 1)
iterateStep (IterateExactly n) = IterateExactly (n - 1)
iterateStep x = x