diff --git a/preserves.nimble b/preserves.nimble index 66d4b5f..c943c71 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "20231028" +version = "20231102" author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves.nim b/src/preserves.nim index 3a4ad2d..ad83f47 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -284,6 +284,18 @@ proc getOrDefault(pr: Preserve; key: Preserve): Preserve = result = v break +proc pop*(pr: var Preserve; key: Preserve; val: var Preserve): bool = + ## Deletes the `key` from a Preserves dictionary. + ## Returns true, if the key existed, and sets `val` to the mapping + ## of the key. Otherwise, returns false, and the `val` is unchanged. + if pr.kind == pkDictionary: + var i = 0 + while i < pr.dict.len: + if pr.dict[i].key == key: + val = move pr.dict[i].val + delete(pr.dict, i, i) + return true + proc incl*(pr: var Preserve; key: Preserve) = ## Include `key` in the Preserves set `pr`. for i in 0..pr.set.high: @@ -638,7 +650,6 @@ proc encode*[E](pr: Preserve[E]): seq[byte] = s.write pr result = cast[seq[byte]](move s.data) - proc decodePreserves*(s: Stream; E = void): Preserve[E] = ## Decode a Preserves value from a binary-encoded stream. if s.atEnd: raise newException(IOError, "End of Preserves stream")