purescript-0.7.0.0: examples/passing/Collatz.purs
module Main where
import Prelude
import Control.Monad.Eff
import Control.Monad.ST
collatz :: Number -> Number
collatz n = runPure (runST (do
r <- newSTRef n
count <- newSTRef 0.0
untilE $ do
modifySTRef count $ (+) 1.0
m <- readSTRef r
writeSTRef r $ if m % 2.0 == 0.0 then m / 2.0 else 3.0 * m + 1.0
return $ m == 1.0
readSTRef count))
main = Debug.Trace.print $ collatz 1000.0