private static V TryGetStacked(KVStack item, K key, V defaultValue)
 {
     for (var i = item; i != KVStack.End; i = i.Tail)
     {
         if (Equals(i.Key, key))
         {
             return(i.Value);
         }
     }
     return(defaultValue);
 }
        private static KVStack Update(KVStack item, KVStack newItem)
        {
            if (Equals(item.Key, newItem.Key))
            {
                return(item.Tail.Push(newItem));
            }

            for (KVStack i = item.Tail, tested = KVStack.End; i != KVStack.End; i = i.Tail, tested = tested.Push(i))
            {
                if (Equals(i.Key, newItem.Key))
                {
                    var result = i.Tail.Push(newItem);
                    for (var ti = tested; ti != KVStack.End; ti = ti.Tail)
                    {
                        result = result.Push(ti);
                    }
                    return(result);
                }
            }

            return(item.Push(newItem));
        }
 public KVStack Push(KVStack head)
 {
     return(new KVStack(head.Key, head.Value, this));
 }
 public KVStack(K key, V value, KVStack tail = null)
 {
     Key   = key;
     Value = value;
     Tail  = tail ?? End;
 }