@@ -18,7 +18,7 @@ module Language.PureScript.CodeGen.Cpp.Recursion
1818
1919import Prelude.Compat
2020import Data.List
21−import Data.Maybe (fromJust)
21+import Data.Maybe (catMaybes, fromJust)
2222import Data.Monoid ((<>))
2323import Data.Text (Text)
2424
@@ -68,7 +68,10 @@ convertRecursiveLets = everywhereOnCpp go
6868convertRecursive :: [Text] -> [Cpp] -> [Cpp]
6969-------------------------------------------------------------------------------------------------
7070convertRecursive names cpps
71− | (_:_) <- lets = (everywhereOnCppTopDown remRecLet <$> cpps) ++ undefines
71+ | (_:_) <- lets
72+ = let recLets = everywhereOnCppTopDown convRecLet <$> cpps
73+ letDeps = catMaybes (letDep <$> cpps)
74+ in nub (letDeps ++ recLets) ++ undefines
7275 where
7376 tableName :: Text
7477 tableName = "let"
@@ -88,12 +91,19 @@ convertRecursive names cpps
8891 | name `elem` names = [cpp]
8992 recLet _ = []
9093 --
91− remRecLet :: Cpp -> Cpp
92− remRecLet cpp@(CppVariableIntroduction (name, _) _ (Just _))
94+ convRecLet :: Cpp -> Cpp
95+ convRecLet cpp@(CppVariableIntroduction (name, _) _ (Just _))
9396 | name == head names = CppNamespace "" $ defines ++ [letTable]
9497 | name `elem` names = CppNoOp
9598 | otherwise = cpp
96− remRecLet cpp = cpp
99+ convRecLet cpp = cpp
100+ --
101+ letDep :: Cpp -> Maybe Cpp
102+ letDep cpp@(CppVariableIntroduction (name, _) _ (Just _))
103+ | name `elem` names = Nothing
104+ | everythingOnCpp (||) (\v -> v == CppVar name) letTable = Just cpp
105+ | otherwise = Nothing
106+ letDep _ = Nothing
97107 --
98108 tableItem :: Cpp -> (Text, Cpp)
99109 tableItem (CppVariableIntroduction (name, _) _ (Just body)) =