diff --git a/preserves.nimble b/preserves.nimble index e8559da..067fcdf 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "3.3.2" # versioned in git, this version is just to confuse nimble +version = "99999999" author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves.nim b/src/preserves.nim index 9cdc185..7cf7ee0 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -1043,6 +1043,22 @@ when isMainModule: var pr = t.toPreserveHook(void) assert fromPreserveHook(t, pr) +proc apply*[E](result: var Preserve[E]; op: proc(_: var Preserve[E])) = + proc recurse(result: var Preserve[E]) = apply(result, op) + op(result) + case result.kind + of pkBoolean, pkFloat, pkDouble, pkSignedInteger, pkString, pkByteString, pkSymbol, pkEmbedded: discard + of pkRecord: + apply(result.record, recurse) + of pkSequence: + apply(result.sequence, recurse) + of pkSet: + apply(result.set, recurse) + of pkDictionary: + apply(result.dict) do (e: var DictEntry[E]): + recurse(e.key) + recurse(e.val) + proc mapEmbeds*(pr: sink Preserve[void]; E: typedesc): Preserve[E] = ## Convert `Preserve[void]` to `Preserve[E]` using `fromPreserve` for `E`. when E is void: {.error: "E cannot be void".}