github.com/mem/u-root@v2.0.1-0.20181004165302-9b18b4636a33+incompatible/cmds/elvish/eval/vars/del_element.go (about)

     1  package vars
     2  
     3  import "github.com/u-root/u-root/cmds/elvish/eval/vals"
     4  
     5  // DelElement deletes an element. It uses a similar process to MakeElement,
     6  // except that the last level of container needs to be Dissoc-able instead of
     7  // Assoc-able.
     8  func DelElement(variable Var, indicies []interface{}) error {
     9  	var err error
    10  	// In "del a[0][1][2]",
    11  	//
    12  	// indicies:  0  1     2
    13  	// assocers: $a $a[0]
    14  	// dissocer:          $a[0][1]
    15  	assocers := make([]interface{}, len(indicies)-1)
    16  	container := variable.Get()
    17  	for i, index := range indicies[:len(indicies)-1] {
    18  		assocers[i] = container
    19  
    20  		var err error
    21  		container, err = vals.Index(container, index)
    22  		if err != nil {
    23  			return err
    24  		}
    25  	}
    26  
    27  	v := vals.Dissoc(container, indicies[len(indicies)-1])
    28  	if v == nil {
    29  		return elemErr{len(indicies), "value does not support element removal"}
    30  	}
    31  
    32  	for i := len(assocers) - 1; i >= 0; i-- {
    33  		v, err = vals.Assoc(assocers[i], indicies[i], v)
    34  		if err != nil {
    35  			return err
    36  		}
    37  	}
    38  	return variable.Set(v)
    39  }