-- one step of integration
stepEuler :: (Floating a) => a -> [a] -> [a]
stepEuler mu u@(x:xs) = (applyBC . (diffused mu)) $! u -- strict evaluation of u
where
diffused mu (left:x:[]) = [] -- ignore outer points
diffused mu (left:x:right:xs) = -- integrate inner points
(x+mu*(left+right-2*x)) : diffused mu (x:right:xs)
applyBC inner = inner `seq` u' `seq` l `seq` r `seq` -- strict evaluation
(l ++ inner ++ r) -- boundary conditions
where u' = [head u] ++ inner ++ [last u]
l = lbc u'
r = rbc u'
lbc = zeroflux mu -- left boundary
rbc = (zeroflux mu) . reverse -- right boundary