private static GraphZipper <T> GoDown <T>(GraphZipper <T> zipper) { if (zipper == null || !zipper.Focus.Children.Any()) { return(null); } var focus = zipper.Focus; var children = focus.Children; var newCrumb = new GraphCrumb <T>(focus.Value, Enumerable.Empty <Graph <T> >(), children.Skip(1)); return(new GraphZipper <T>(children.First(), new[] { newCrumb }.Concat(zipper.Crumbs))); }
private static GraphZipper <T> GoRight <T>(GraphZipper <T> zipper) { if (zipper == null || !zipper.Crumbs.Any() || !zipper.Crumbs.First().Right.Any()) { return(null); } var crumbs = zipper.Crumbs; var firstCrumb = crumbs.First(); var newCrumb = new GraphCrumb <T>(firstCrumb.Value, firstCrumb.Left.Concat(new[] { zipper.Focus }), firstCrumb.Right.Skip(1)); return(new GraphZipper <T>(firstCrumb.Right.First(), new[] { newCrumb }.Concat(crumbs.Skip(1)))); }