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; }