private static TreeZipper GoDown(TreeZipper zipper) { if (zipper == null || !zipper.Focus.Children.Any()) { return(null); } var focus = zipper.Focus; var children = focus.Children; var newCrumb = new TreeCrumb(focus.Value, Array.Empty <Tree>(), children.Skip(1).ToArray()); return(new TreeZipper(children.First(), new[] { newCrumb }.Concat(zipper.Crumbs))); }
private static TreeZipper GoRight(TreeZipper 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 TreeCrumb(firstCrumb.Value, firstCrumb.Left.Concat(new[] { zipper.Focus }).ToArray(), firstCrumb.Right.Skip(1).ToArray()); return(new TreeZipper(firstCrumb.Right.First(), new[] { newCrumb }.Concat(crumbs.Skip(1)))); }