internal void BackwardTraversal(IEnumerable <long> targetTransitionTargets, Action <long> actionOnResultingTransitionTarget, Func <long, bool> transitionTargetsToIgnore) { var transitionTargetNodes = targetTransitionTargets.Select(TransitionTargetToNodeIndex); Func <long, bool> ignoreNodeFunc = node => { var transitionTarget = TryGetTransitionTargetIndex(node); if (transitionTarget == null) { return(false); } return(transitionTargetsToIgnore(transitionTarget.Value)); }; var ancestors = _baseGraph.GetAncestors(transitionTargetNodes, ignoreNodeFunc); foreach (var ancestor in ancestors) { var transitionTargetOfAncestor = TryGetTransitionTargetIndex(ancestor.Key); if (transitionTargetOfAncestor != null) { actionOnResultingTransitionTarget(transitionTargetOfAncestor.Value); } } }