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 }