예제 #1
0
 public IEnumerator <T> GetEnumerator()
 {
     for (IImmutableStack <T> stack = this; !stack.IsEmpty; stack = stack.Pop())
     {
         yield return(stack.Peek());
     }
 }
예제 #2
0
        static IImmutableStack <T> GetNextElementInHierarchyCore <T>(IImmutableStack <T> rootStack, Func <T, IList <T> > getChildren, Func <IList <T>, T, int> indedOf, bool skipChildren) where T : class
        {
            var currentElement = rootStack.Peek();
            var children       = getChildren(currentElement);

            if (!skipChildren && children.Any())
            {
                return(rootStack.Push(children.First()));
            }

            var parents = rootStack.Pop();
            var parent  = parents.FirstOrDefault();

            if (parent == null)
            {
                return(rootStack);
            }

            var neighbors = getChildren(parent);
            var index     = indedOf(neighbors, currentElement);

            if (index < neighbors.Count - 1)
            {
                return(parents.Push(neighbors[index + 1]));
            }

            return(GetNextElementInHierarchyCore(parents, getChildren, indedOf, skipChildren: true));
        }
예제 #3
0
        public static IImmutableStack <T> Pop <T>(this IImmutableStack <T> stack, out T value)
        {
            Requires.NotNull(stack, nameof(stack));

            value = stack.Peek();
            return(stack.Pop());
        }
예제 #4
0
        public void DeserializeStackInterface()
        {
            string json = @"[
  ""One"",
  ""II"",
  ""3""
]";

            IImmutableStack <string> data = JsonSerializer.Deserialize <IImmutableStack <string> >(json);

            Assert.False(data.IsEmpty);
            Assert.Equal("3", data.Peek());
            data = data.Pop();
            Assert.Equal("II", data.Peek());
            data = data.Pop();
            Assert.Equal("One", data.Peek());
        }
예제 #5
0
        public static IImmutableStack <T> Pop <T>(this IImmutableStack <T> stack, out T value)
        {
            Requires.NotNull(stack, "stack");
            Contract.Ensures(Contract.Result <IImmutableStack <T> >() != null);

            value = stack.Peek();
            return(stack.Pop());
        }
        public static IImmutableStack <T> Pop <T>(this IImmutableStack <T> stack, out T value)
        {
            //Assert.IsNotNull(stack, nameof(stack));
            Contract.Ensures(Contract.Result <IImmutableStack <T> >() != null);

            value = stack.Peek();
            return(stack.Pop());
        }
예제 #7
0
        private static ImmutableStack <T> Reverse(IImmutableStack <T> stack)
        {
            ImmutableStack <T> immutableStack1 = ImmutableStack <T> .Empty;

            for (IImmutableStack <T> immutableStack2 = stack; !immutableStack2.IsEmpty; immutableStack2 = immutableStack2.Pop())
            {
                immutableStack1 = immutableStack1.Push(immutableStack2.Peek());
            }
            return(immutableStack1);
        }
예제 #8
0
 public static Option <T> peek <T>(IImmutableStack <T> stack)
 {
     try
     {
         return(Some(stack.Peek()));
     }
     catch (InvalidOperationException)
     {
         return(None);
     }
 }
예제 #9
0
        public IEnumerator <T> GetEnumerator()
        {
            IImmutableStack <T> stack = this;

            do
            {
                yield return(stack.Peek());

                stack = stack.Pop();
            }while (stack != Empty);
        }
예제 #10
0
 public static IImmutableStack <T> Pop <T>(
     this IImmutableStack <T> stack,
     out T value)
 {
     if (stack == null)
     {
         throw new ArgumentNullException(nameof(stack));
     }
     value = stack.Peek();
     return(stack.Pop());
 }
예제 #11
0
        public static IImmutableStack <T> Reverse <T>(this IImmutableStack <T> stack)
        {
            var reverse = Empty <T>();

            while (!stack.IsEmpty)
            {
                reverse = reverse.Push(stack.Peek());
                stack   = stack.Pop();
            }
            return(reverse);
        }
예제 #12
0
        static IImmutableStack <T> GetPrevElementInHierarchyCore <T>(IImmutableStack <T> rootStack, Func <T, IList <T> > getChildren, Func <IList <T>, T, int> indedOf) where T : class
        {
            var currentElement = rootStack.Peek();

            Func <T, IEnumerable <T> > getChildrenPath = element => LinqExtensions.Unfold(element, x => getChildren(x).LastOrDefault(), x => x == null);

            var parents = rootStack.Pop();
            var parent  = parents.FirstOrDefault();

            if (parent == null)
            {
                return(ImmutableStack.Empty <T>().PushMultiple(getChildrenPath(currentElement)));
            }

            var neighbors = getChildren(parent);
            var index     = indedOf(neighbors, currentElement);

            if (index > 0)
            {
                return(parents.PushMultiple(getChildrenPath(neighbors[index - 1])));
            }

            return(parents);
        }
예제 #13
0
 public static T peekUnsafe <T>(IImmutableStack <T> stack) =>
 stack.Peek();
예제 #14
0
 public T Peek()
 {
     return(forwards.Peek());
 }
예제 #15
0
 public static void Deconstruct <T>(this IImmutableStack <T> src, out T head, out IImmutableStack <T> tail)
 {
     head = src.Peek();
     tail = src.Pop();
 }
예제 #16
0
 public Covers Covers()
 {
     return(_moves.Peek());
 }