{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE FlexibleInstances #-}
module Imj.Graphics.Class.DiscreteMorphing
( DiscreteMorphing(..)
, module Imj.Graphics.Class.DiscreteDistance
, module Imj.Graphics.Class.Drawable
, module Imj.Graphics.Class.Draw
, MonadIO
, MonadReader
) where
import Imj.Prelude
import Control.Monad.IO.Class(MonadIO)
import Control.Monad.Reader.Class(MonadReader)
import Imj.Graphics.Class.DiscreteDistance
import Imj.Graphics.Class.Draw
import Imj.Graphics.Class.Drawable
class (DiscreteDistance v, Drawable v)
=> DiscreteMorphing v where
drawMorphing :: (Draw e, MonadReader e m, MonadIO m)
=> v
-> v
-> Int
-> m ()
{-# INLINABLE drawMorphingSuccessive #-}
drawMorphingSuccessive :: (Draw e, MonadReader e m, MonadIO m)
=> Successive v
-> Int
-> m ()
drawMorphingSuccessive (Successive []) _ = error "empty successive"
drawMorphingSuccessive (Successive [a]) _ = drawMorphing a a 0
drawMorphingSuccessive (Successive l@(a:b:_)) i
| i <= 0 = drawMorphing a a 0
| i >= lf = drawMorphingSuccessive (Successive $ tail l) $ i-lf
| otherwise = drawMorphing a b i
where lf = pred $ distance a b