import Control.Applicative
import Control.Monad
import Data.List
import Data.Monoid
import FRP.Reactive
import FRP.Reactive.FieldTrip
import Graphics.FieldTrip

allPositions = [Vector3 x y z | [x, y, z] <- replicateM 3 [0..2]]
badPositions = [
    Vector3 1 1 0,
    Vector3 1 1 1,
    Vector3 1 1 2,
    Vector3 1 0 1,
    Vector3 1 2 1,
    Vector3 0 1 1,
    Vector3 2 1 1]
transformations = [uscale3 (1/3 :: Double) `mappend` translate3 v | v <- allPositions \\ badPositions]

sponge n = iterate (\s -> mconcat (map (*% s) transformations)) cube !! n
main = anim3 . const . spinningG . sponge $ 2

spinningG g = liftA2 (*%) spinning (pure g)
spinning = xf . (*2) <$> time
 where
   xf t =           translate3 (Vector3 (0::Double) 0 (3*sin (-t/5)))
          `mappend` rotate3 t (Vector3 0.1 0.2 0.3)
          `mappend` uscale3 0.2
