packages feed

purescript-0.7.2.0: examples/passing/Collatz.purs

module Main where

import Prelude
import Control.Monad.Eff
import Control.Monad.ST

collatz :: Int -> Int
collatz n = runPure (runST (do
  r <- newSTRef n
  count <- newSTRef 0
  untilE $ do
    modifySTRef count $ (+) 1
    m <- readSTRef r
    writeSTRef r $ if m `mod` 2 == 0 then m / 2 else 3 * m + 1
    return $ m == 1
  readSTRef count))

main = Control.Monad.Eff.Console.print $ collatz 1000