I didn't have a chance to look at your code, but from your original problem statement, maybe it would be easier to implement correctly if you modeled it as `Dict String (Array v)` instead of as `Dict String v` with specially formatted keys. Modeled as `Dict String (Array v)`, you could just remove items from the arrays and not have to do any bubbling.
On Mon, Jun 27, 2016 at 5:40 PM, Mark Green <[email protected]> wrote: > I have a dictionary which contains a series of keys with names "ls-1", > "ls-2", "ls-3", etc. and a key "ls-count" stating how many there are. When > one of these is deleted, say "ls-2" is deleted, I want to bubble the > remainder up so that the old "ls-3" will become "ls-2" and so on. > > The code being used for this at the moment is: > > updateDeleteField : String -> Model -> Model > updateDeleteField key model = > let > keyhyphenindex = String.indexes "-" key > realKeyHyphenIndex = case (List.head keyhyphenindex) of > Nothing -> Debug.crash "Missing hyphen in expandable form deletion > process" > Just x -> x > keyPrehyphen = (String.slice 0 realKeyHyphenIndex key) ++ "-" > countName = Debug.log "name of the count variable:" (keyPrehyphen ++ > "count") > removeResponse = Debug.log "remove the deleted item:" (killResponse > model key) > reduceCount = Debug.log "reduce the count:" (setResponse > removeResponse countName (toString ((getResponseInt removeResponse > countName 0) - 1))) > -- Integrity bubble: check if we've reached the end of the list, if so > we're done > checkInteg value m = if value >= ((getResponseInt m countName 0)) then > Debug.log "Completing.." m else > let > active = Debug.log "active" (keyPrehyphen ++ (toString value)) -- > Name of the current item > next = Debug.log "next" (keyPrehyphen ++ (toString (value+1))) -- > Name of the next item > in case (Dict.get active m.character) of > -- If the current item is not missing, recurse onto the rest of > the numbers > Just x -> Debug.log ("Active is ok so moving on to " ++ (toString > (value+1))) (checkInteg (value+1) m) > -- If the current item is missing, look at the next one > Nothing -> case (Dict.get next m.character) of > -- If the next one is present, move it down to fill the current > gap, then recurse > Just higher -> Debug.log ("Active is missing, bubbling" ++ next > ++" to " ++ active) (checkInteg (value) (setResponse (killResponse m next) > active higher)) > -- That being missing too should be impossible since only one > thing can be deleted at a time > Nothing -> Debug.crash ("More than one form item deleted at > once? " ++ active ++ " unset, so is " ++ next ++ ", deleted key is " ++ key) > in checkInteg 1 reduceCount > > (killResponse m x deletes the tag key x from m.character, setResponse m x > v sets the tag key x to v in m.character) > > Everything up to checkInteg works fine, but at that point the debug output > goes crazy. It'll often print the Completed message before any of the > others, or just stop after bubbling for no reason, or say it is bubbling > but then not change anything. Can anyone tell me what's wrong? > > > -- > You received this message because you are subscribed to the Google Groups > "Elm Discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
