module HarmonicOscillation (
HarmonicOscillation(..),
harmonic,
step,
) where
import Control.Monad.State (State, get, put)
data HarmonicOscillation = HarmonicOscillation
{ HarmonicOscillation -> Double
position :: Double
, HarmonicOscillation -> Double
time :: Double
}
step :: State HarmonicOscillation Double
step :: State HarmonicOscillation Double
step = do
(HarmonicOscillation Double
_ Double
t) <- StateT HarmonicOscillation Identity HarmonicOscillation
forall s (m :: * -> *). MonadState s m => m s
get
let p' :: Double
p' = Double -> Double
forall a. Floating a => a -> a
sin Double
t
HarmonicOscillation -> StateT HarmonicOscillation Identity ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put (Double -> Double -> HarmonicOscillation
HarmonicOscillation Double
p' (Double
t Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
0.01))
Double -> State HarmonicOscillation Double
forall a. a -> StateT HarmonicOscillation Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Double
p'
harmonic :: State HarmonicOscillation [Double]
harmonic :: State HarmonicOscillation [Double]
harmonic = do
Double
p <- State HarmonicOscillation Double
step
[Double]
ps <- State HarmonicOscillation [Double]
harmonic
[Double] -> State HarmonicOscillation [Double]
forall a. a -> StateT HarmonicOscillation Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return (Double
p Double -> [Double] -> [Double]
forall a. a -> [a] -> [a]
: [Double]
ps)