module Reanimate.Effect where import Graphics.SvgTree (Tree) import Reanimate.Animation import Reanimate.Svg type Effect = Double -> Double -> Tree -> Tree overBeginning :: Double -> Effect -> Effect overBeginning maxT fn = \_d t -> if t < maxT then fn maxT t else id overEnding :: Double -> Effect -> Effect overEnding minT fn d t = if t >= blankDur then fn minT (t-blankDur) else id where blankDur = d-minT reverseE :: Effect -> Effect reverseE fn = \d t -> fn d (d-t) delayE :: Double -> Effect -> Effect delayE delayT fn = \d t -> overEnding (d-delayT) fn d t applyE :: Effect -> Animation -> Animation applyE fn (Animation d genFrame) = Animation d $ \t -> fn d (d*t) $ genFrame t constE :: (Tree -> Tree) -> Effect constE fn _d _t = fn fadeInE :: Effect fadeInE d t = withGroupOpacity (t/d) fadeOutE :: Effect fadeOutE = reverseE fadeInE drawInE :: Effect drawInE d t = withFillOpacity 0 . partialSvg (t/d) . pathify drawOutE :: Effect drawOutE = reverseE drawInE fillInE :: Effect fillInE d t = withFillOpacity f where f = t/d