コード例 #1
0
    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)));
    }
コード例 #2
0
    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))));
    }