patterns: unpackLiterals more

This commit is contained in:
Emery Hemingway 2023-06-10 00:59:54 +01:00
parent 209ae51580
commit 7a36a6e8a4
7 changed files with 44 additions and 4 deletions

View File

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

View File

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

View File

@ -1,6 +1,6 @@
# Package
version = "20230608"
version = "20230610"
author = "Emery Hemingway"
description = "Syndicated actors for conversational concurrency"
license = "Unlicense"

View File

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

22
tests/test_patterns.nim Normal file
View File

@ -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 == """<rec Observe [<rec rec [<lit foo> <arr [<bind <_>> <_> <_>]>]> <_>]>""")
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)

15
tests/test_schema.nim Normal file
View File

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

2
tests/test_schema.prs Normal file
View File

@ -0,0 +1,2 @@
version 1 .
Foo = <foo @x [string ...] @y int @z int> .