@@ -18,7 +18,7 @@ module Language.PureScript.CodeGen.Cpp.Recursion
19import Prelude.Compat
19import Prelude.Compat
20import Data.List
20import Data.List
21−import Data.Maybe (fromJust)
21+import Data.Maybe (catMaybes, fromJust)
22import Data.Monoid ((<>))
22import Data.Monoid ((<>))
23import Data.Text (Text)
23import Data.Text (Text)
@@ -68,7 +68,10 @@ convertRecursiveLets = everywhereOnCpp go
68convertRecursive :: [Text] -> [Cpp] -> [Cpp]
68convertRecursive :: [Text] -> [Cpp] -> [Cpp]
69-------------------------------------------------------------------------------------------------
69-------------------------------------------------------------------------------------------------
70convertRecursive names cpps
70convertRecursive names cpps
71− | (_:_) <- lets = (everywhereOnCppTopDown remRecLet <$> cpps) ++ undefines
72+ = let recLets = everywhereOnCppTopDown convRecLet <$> cpps
73+ letDeps = catMaybes (letDep <$> cpps)
74+ in nub (letDeps ++ recLets) ++ undefines
73 tableName :: Text
76 tableName :: Text
74 tableName = "let"
77 tableName = "let"
@@ -88,12 +91,19 @@ convertRecursive names cpps
88 | name `elem` names = [cpp]
91 | name `elem` names = [cpp]
89 recLet _ = []
92 recLet _ = []
91− remRecLet :: Cpp -> Cpp
94+ convRecLet :: Cpp -> Cpp
92− remRecLet cpp@(CppVariableIntroduction (name, _) _ (Just _))
95+ convRecLet cpp@(CppVariableIntroduction (name, _) _ (Just _))
93 | name == head names = CppNamespace "" $ defines ++ [letTable]
96 | name == head names = CppNamespace "" $ defines ++ [letTable]
94 | name `elem` names = CppNoOp
97 | name `elem` names = CppNoOp
95 | otherwise = cpp
98 | otherwise = cpp
96− remRecLet cpp = cpp
99+ convRecLet cpp = cpp
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
98 tableItem :: Cpp -> (Text, Cpp)
108 tableItem :: Cpp -> (Text, Cpp)
99 tableItem (CppVariableIntroduction (name, _) _ (Just body)) =
109 tableItem (CppVariableIntroduction (name, _) _ (Just body)) =