diff --git a/src/syndicate.nim b/src/syndicate.nim index aa4dee2..fe28aa9 100644 --- a/src/syndicate.nim +++ b/src/syndicate.nim @@ -20,7 +20,7 @@ export patterns export Actor, Assertion, Facet, Handle, Ref, Symbol, Turn, TurnAction, `$`, addCallback, analyse, asyncCheck, bootDataspace, facet, future, inFacet, message, newDataspace, onStop, publish, - retract, replace, run, stop, unembed + retract, replace, run, stop, unembed, unpackLiterals proc `!`*(typ: static typedesc): Pattern {.inline.} = patterns.dropType(typ) diff --git a/src/syndicate/patterns.nim b/src/syndicate/patterns.nim index 0d9018e..e3c02fc 100644 --- a/src/syndicate/patterns.nim +++ b/src/syndicate/patterns.nim @@ -212,7 +212,7 @@ proc grabDict*(): Pattern = proc unpackLiterals*[E](pr: Preserve[E]): Preserve[E] = result = pr apply(result) do (pr: var Preserve[E]): - if pr.isRecord("lit", 1): + if pr.isRecord("lit", 1) or pr.isRecord("dict", 1) or pr.isRecord("arr", 1) or pr.isRecord("set", 1): pr = pr.record[0] proc inject*(pat: Pattern; bindings: openArray[(int, Pattern)]): Pattern = diff --git a/syndicate.nimble b/syndicate.nimble index 91cdcbd..a1d1031 100644 --- a/syndicate.nimble +++ b/syndicate.nimble @@ -1,6 +1,6 @@ # Package -version = "20230608" +version = "20230610" author = "Emery Hemingway" description = "Syndicated actors for conversational concurrency" license = "Unlicense" diff --git a/tests/Tupfile b/tests/Tupfile index c8cc278..9525ad8 100644 --- a/tests/Tupfile +++ b/tests/Tupfile @@ -1,2 +1,3 @@ include_rules -: foreach test*.nim | $(SYNDICATE_PROTOCOL) |> !nim_run |> +: foreach *.prs |> !preserves_schema_nim |> | {schema} +: foreach test*.nim | {schema} $(SYNDICATE_PROTOCOL) |> !nim_run |> diff --git a/tests/test_patterns.nim b/tests/test_patterns.nim new file mode 100644 index 0000000..883d45a --- /dev/null +++ b/tests/test_patterns.nim @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: ☭ Emery Hemingway +# SPDX-License-Identifier: Unlicense + +import std/unittest + +import preserves, syndicate +from syndicate/protocols/dataspace import Observe +type Observe = dataspace.Observe[Ref] + +import ./test_schema + + +test "patterns": + let observerPat = ?Observe(pattern: !Foo) ?? {0: grab()} + check($observerPat == """ > <_> <_>]>]> <_>]>""") + + let + value = @["alles", "in", "ordnung"] + observer = toPreserve(Observe(pattern: inject(?Foo, { 0: ?value })), Ref) + have = capture(observerPat, observer).toPreserve(Ref).unpackLiterals + want = [value.toPreserve(Ref)].toPreserve(Ref) + check(have == want) diff --git a/tests/test_schema.nim b/tests/test_schema.nim new file mode 100644 index 0000000..1c69596 --- /dev/null +++ b/tests/test_schema.nim @@ -0,0 +1,15 @@ + +import + preserves + +type + Foo* {.preservesRecord: "foo".} = object + `x`*: seq[string] + `y`*: BiggestInt + `z`*: BiggestInt + +proc `$`*(x: Foo): string = + `$`(toPreserve(x)) + +proc encode*(x: Foo): seq[byte] = + encode(toPreserve(x)) diff --git a/tests/test_schema.prs b/tests/test_schema.prs new file mode 100644 index 0000000..a8658b9 --- /dev/null +++ b/tests/test_schema.prs @@ -0,0 +1,2 @@ +version 1 . +Foo = .