@@ -301,74 +301,66 @@ addDefNode home name args body mainDeps graph =
301data State =
301data State =
303 { _values :: [(N.Name, Opt.Expr)]
303 { _values :: [(N.Name, Opt.Expr)]
304− , _graph :: Opt.Graph
304+ , _functions :: [Opt.Def]
308addRecDefs :: ModuleName.Canonical -> [Can.Def] -> Opt.Graph -> Opt.Graph
308addRecDefs :: ModuleName.Canonical -> [Can.Def] -> Opt.Graph -> Opt.Graph
309−addRecDefs home defs graph =
309+addRecDefs home defs (Opt.Graph mains nodes fieldCounts) =
311− cycleValues = foldr addValueName Set.empty defs
311+ valueNames = foldr addValueName [] defs
312− dummyName = Opt.Global home (N.toCompositeName (Set.toList cycleValues))
312+ cycleName = Opt.Global home (N.toCompositeName valueNames)
313+ cycle = Set.fromList valueNames
314+ links = foldr (addLink home (Opt.Link cycleName)) Map.empty defs
314− (deps, fields, State cyclicValuePairs newGraph) =
316+ (deps, fields, State values funcs) =
315 Names.run $
317 Names.run $
316− foldM (addRecDef home dummyName cycleValues) (State [] graph) defs
318+ foldM (addRecDef cycle) (State [] []) defs
318− addToGraph dummyName (Opt.Cycle cyclicValuePairs deps) fields newGraph
320+ Opt.Graph
322+ (Map.insert cycleName (Opt.Cycle values funcs deps) (Map.union links nodes))
323+ (Map.unionWith (+) fields fieldCounts)
321−addValueName :: Can.Def -> Set.Set N.Name -> Set.Set N.Name
326+addValueName :: Can.Def -> [N.Name] -> [N.Name]
322−addValueName def valueNames =
327+addValueName def names =
323 case def of
328 case def of
324− Can.Def (A.At _ name) [] _ ->
329+ Can.Def (A.At _ name) args _ -> if null args then name:names else names
325− Set.insert name valueNames
330+ Can.TypedDef (A.At _ name) _ args _ _ -> if null args then name:names else names
327− Can.TypedDef (A.At _ name) _ [] _ _ ->
328− Set.insert name valueNames
330− _ ->
333+addLink :: ModuleName.Canonical -> Opt.Node -> Can.Def -> Map.Map Opt.Global Opt.Node -> Map.Map Opt.Global Opt.Node
331− valueNames
334+addLink home link def links =
336+ Can.Def (A.At _ name) _ _ ->
337+ Map.insert (Opt.Global home name) link links
339+ Can.TypedDef (A.At _ name) _ _ _ _ ->
340+ Map.insert (Opt.Global home name) link links
335-- ADD RECURSIVE DEFS
344-- ADD RECURSIVE DEFS
338−addRecDef :: ModuleName.Canonical -> Opt.Global -> Expr.Cycle -> State -> Can.Def -> Names.Tracker State
347+addRecDef :: Set.Set N.Name -> State -> Can.Def -> Names.Tracker State
339−addRecDef home dummyName cycle state@(State values graph) def =
348+addRecDef cycle state def =
340 case def of
349 case def of
341− Can.Def (A.At _ name) [] body ->
350+ Can.Def (A.At _ name) args body ->
342− addRecValue home dummyName cycle name body state
351+ addRecDefHelp cycle state name args body
344− Can.TypedDef (A.At _ name) _ [] body _ ->
353+ Can.TypedDef (A.At _ name) _ args body _ ->
345− addRecValue home dummyName cycle name body state
354+ addRecDefHelp cycle state name (map fst args) body
349− (deps, fields, odef) =
350− Names.run (Expr.optimizePotentialTailCall cycle def)
352− pure $ State values $
354− Opt.Def name body ->
355− let node = Opt.Define body deps in
356− addToGraph (Opt.Global home name) node fields graph
358− Opt.TailDef name args body ->
359− let node = Opt.DefineTailFunc args body deps in
360− addToGraph (Opt.Global home name) node fields graph
357+addRecDefHelp :: Set.Set N.Name -> State -> N.Name -> [Can.Pattern] -> Can.Expr -> Names.Tracker State
358+addRecDefHelp cycle (State values funcs) name args body =
361+ do obody <- Expr.optimize cycle body
362+ pure $ State ((name, obody) : values) funcs
363−addRecValue :: ModuleName.Canonical -> Opt.Global -> Expr.Cycle -> N.Name -> Can.Expr -> State -> Names.Tracker State
364+ _:_ ->
364−addRecValue home dummyName cycle name body (State values (Opt.Graph mains nodes fields)) =
365+ do odef <- Expr.optimizePotentialTailCall cycle name args body
365− do obody <- Expr.optimize cycle body
366+ pure $ State values (odef : funcs)
367− let global = Opt.Global home name
368− let node = Opt.Link dummyName
372− { _values = (name, obody) : values
373− , _graph = Opt.Graph mains (Map.insert global node nodes) fields