package commands import ( "errors" "redisClone/pkg/core" "strconv" ) func Lrem(args []string, getShard func(k string) *core.Shard) interface{} { key := args[1] count, err := strconv.Atoi(args[2]) toBeRemoved := args[3] if err != nil { return errors.New("value is not an integer") } s := getShard(key) item, exists := s.Data[key] if !exists { return 0 } list, ok := item.Value.([]string) if !ok { return errors.New("WRONGTYPE Operation against a key holding the wrong kind of value") } counter := 0 absCount := count if count < 0 { absCount = -count } var newList []string if count == 0 { newList = []string{} for _, value := range list { if value == toBeRemoved { counter++ } else { newList = append(newList, value) } } } else if count > 0 { newList = []string{} for _, value := range list { if value == toBeRemoved && counter < absCount { counter++ } else { newList = append(newList, value) } } } else { // count < 0 reversedNewList := []string{} for i := len(list) - 1; i >= 0; i-- { value := list[i] if value == toBeRemoved && counter < absCount { counter++ } else { reversedNewList = append(reversedNewList, value) } } newList = make([]string, len(reversedNewList)) for i, v := range reversedNewList { newList[len(reversedNewList)-1-i] = v } } if len(newList) == 0 { delete(s.Data, key) } else { item.Value = newList s.Data[key] = item } return counter }