
So this would generate a large circular movement:
circularMovement :: MovementFunc
This generates a small wobble.
wobble :: MovementFunc
Then I can compute the final position once per animation frame by superimposing or composing individual movements:
computePosition :: [MovementFunc] -> Time -> IO Position
Is there any specific reason why you can't compute the wobbles all at once beforehand? I'm thinking something along the lines of FRP: type Behaviour a = Time -> a type MovementFunc = Behaviour RelativeMovement So you still have wobble :: MovementFunc, but MovementFunc is pure. And you combine them not with (.) but with (<*>): mergeMovements :: [Behaviour RelativeMovement] -> Behaviour RelativeMovement mergeMovements = (mconcat .) . sequenceA computePosition :: [Behaviour RelativeMovement] -> Behaviour Position computePosition movements time = moveBy (mergeMovements movements time) origin Look, Ma, I'm still not using any IO! Wheeee! Cheers, MarLinn