code: def _update(self, node, key, value):
          
          node_type = self._get_node_type(node)
  
          if node_type == NODE_TYPE_BLANK:
              return [pack_nibbles(with_terminator(key)), value]
  
          elif node_type == NODE_TYPE_BRANCH:
              if not key:
                  node[-1] = value
              else:
                  new_node = self._update_and_delete_storage(
                      self._decode_to_node(node[key[0]]),
                      key[1:], value)
                  node[key[0]] = self._encode_node(new_node)
              return node
  
          elif is_key_value_type(node_type):
              return self._update_kv_node(node, key, value)
docs: update item inside a node
  
          :param node: node in form of list, or BLANK_NODE
          :param key: nibble list without terminator
              .. note:: key may be []
          :param value: value string
          :return: new node
  
          if this node is changed to a new node, it's parent will take the
          responsibility to *store* the new node storage, and delete the old
          node storage