4.3BSD/usr/contrib/icon/book/17/close.icn

procedure successors(graph,nodes)
   local snodes
   snodes := ''	# start with none
   graph ? repeat {
      if tab(any(nodes)) then snodes ++:= move(1)
      else move(2) | break	# exit at end of string
      }
   return snodes
end

procedure closure(graph,nodes)
   local snodes
   snodes := nodes	# start with given nodes
   while snodes ~===
      (nodes ++:= successors(graph,nodes)) do
         snodes := nodes	# update if change
   return nodes
end