import Text.Megaparsec.Text (Parser)
import qualified Control.Applicative as CA
--- import Data.Vector ((!), (//))
import qualified Data.Vector as V
import Data.List
step :: Particle -> Particle
step particle = particle {position = p', velocity = v'}
where pv' = V.zipWith3 updatePV (position particle) (velocity particle) (acceleration particle)
- !(p', v') = V.unzip pv'
+ (p', v') = V.unzip pv'
updatePV p v a = (p + v + a, v + a)
quiescent :: Particle -> Bool
quiescent particle = and qDimensions
where qDimensions = V.zipWith3 sameSigns (position particle) (velocity particle) (acceleration particle)
- sameSigns !p !v !a = if a == 0 && v == 0
- then True
- else if a == 0
- then signum p == signum v
- else signum p == signum v && signum v == signum a
+ sameSigns p v a = if a == 0 && v == 0
+ then True
+ else if a == 0
+ then signum p == signum v
+ else signum p == signum v && signum v == signum a
withMinX particles = minX `elemIndices` absXs
pAbsX particle = V.foldl1' (+) $ V.map abs (position particle)
-
removeColliders particles = particles'
where positions = map position particles
duplicatePositions = S.fromList $ concat $ filter (\g -> length g > 1) $ group $ sort positions