module Language.ImProve.Examples
( gcd'
, gcdMain
, gcdBuild
) where
import Language.ImProve
gcd' :: E Int -> E Int -> Stmt (E Bool, E Int)
gcd' a b = do
a0 <- int "a0" 0
b0 <- int "b0" 0
a1 <- int "a1" 0
b1 <- int "b1" 0
if_ "startNew" (a /=. ref a0 ||. b /=. ref b0) $ do
a0 <== a
b0 <== b
a1 <== a
b1 <== b
if_ "reduceA" (ref a1 >. ref b1) $ do
a1 <== ref a1 ref b1
if_ "reduceB" (ref b1 >. ref a1) $ do
b1 <== ref b1 ref a1
return (ref a1 ==. ref b1, ref a1)
gcdMain :: Stmt ()
gcdMain = do
a <- input int "a"
b <- input int "b"
done <- bool "done" False
result <- int "result" 0
(done', result') <- scope "gcd" $ gcd' a b
done <== done'
result <== result'
gcdBuild :: IO ()
gcdBuild = code "gcd" gcdMain