public void InsertBefore(ILNodeValue<T> base, ILNodeValue<T> newValue) {
    ILNode<T> newNode = newValue.GetNode(identifier);
    ILNode<T> baseNode = base.GetNode(identifier);

    newNode.Delete();
    baseNode.InsertBefore(newNode);
    if (baseNode == head) head = newNode;
  }
  public void InsertAfter(ILNodeValue<T> base, ILNodeValue<T> newValue) {
    ILNode<T> newNode = newValue.GetNode(identifier);
    ILNode<T> baseNode = base.GetNode(identifier);

    newNode.Delete();
    baseNode.InsertAfter(newNode);
    if (baseNode == tail) tail = newNode;
  }
 public void Append(ILNodeValue<T> value) {
   ILNode<T> node = value.GetNode(identifier);
   if (tail == null) {
     head = tail = node;
     return;
   }
   tail.InsertAfter(node);
   tail = node;
 }
  public void Delete(ILNodeValue<T> value) {
    ILNode<T> node = value.GetNode(identifier);
    ILNode<T> next = node.GetNext();
    ILNode<T> prev = node.GetPrev();

    node.Delete();

    if (node == head) {
      head = next;
    }
    if (node == tail) {
      tail = prev;
    }
  }