Set type conversions

This commit is contained in:
Emery Hemingway 2022-05-18 13:56:41 -05:00
parent aaf5e7ce39
commit 5043d8595a
3 changed files with 19 additions and 2 deletions

View File

@ -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"

View File

@ -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:

View File

@ -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