From 5043d8595a660a35358399b0a428bcb040921985 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Wed, 18 May 2022 13:56:41 -0500 Subject: [PATCH] Set type conversions --- preserves.nimble | 2 +- src/preserves.nim | 17 +++++++++++++++++ src/preserves/schemaparse.nim | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/preserves.nimble b/preserves.nimble index 0377d28..5561e05 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "3.3.0" # versioned in git, this version is just to confuse nimble +version = "3.3.1" # versioned in git, this version is just to confuse nimble author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves.nim b/src/preserves.nim index 0245166..541a751 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -700,6 +700,9 @@ proc toPreserve*[T](x: T; E = void): Preserve[E] = elif T is array | seq: result = Preserve[E](kind: pkSequence, sequence: newSeqOfCap[Preserve[E]](x.len)) for v in x.items: result.sequence.add(toPreserve(v, E)) + elif T is set: + result = Preserve[E](kind: pkSet, set: newSeqOfCap[Preserve[E]](x.len)) + for v in x.items: result.incl(toPreserve(v, E)) elif T is bool: result = Preserve[E](kind: pkBoolean, bool: x) elif T is float32: @@ -998,6 +1001,20 @@ proc preserveTo*(pr: Preserve; T: typedesc): Option[T] = if fromPreserve(v, pr): result = some(move v) +proc fromPreserveHook*[T, E](v: var set[T]; pr: Preserve[E]): bool = + ## Hook for unpreserving a `set`. + if pr.kind == pkSet: + reset v + result = true + var vv: T + for e in pr.set: + result = fromPreserve(vv, e) + if result: + v.incl vv + else: + reset v + break + proc fromPreserveHook*[T, E](set: var HashSet[T]; pr: Preserve[E]): bool = ## Hook for preserving ``HashSet``. if pr.kind == pkSet: diff --git a/src/preserves/schemaparse.nim b/src/preserves/schemaparse.nim index caeda65..8e673f4 100644 --- a/src/preserves/schemaparse.nim +++ b/src/preserves/schemaparse.nim @@ -190,7 +190,7 @@ const parser = peg("Schema", p: ParseState): var n = initRecord(toSymbol"seqof", popStack()) pushStack n - SetOfPattern <- "#{" * SimplePattern * '}': + SetOfPattern <- "#{" * S * SimplePattern * S * '}': var n = initRecord(toSymbol"setof", popStack()) pushStack n