patterns: unpackLiterals more
This commit is contained in:
parent
209ae51580
commit
7a36a6e8a4
|
@ -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)
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Package
|
||||
|
||||
version = "20230608"
|
||||
version = "20230610"
|
||||
author = "Emery Hemingway"
|
||||
description = "Syndicated actors for conversational concurrency"
|
||||
license = "Unlicense"
|
||||
|
|
|
@ -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 |>
|
||||
|
|
|
@ -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)
|
|
@ -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))
|
|
@ -0,0 +1,2 @@
|
|||
version 1 .
|
||||
Foo = <foo @x [string ...] @y int @z int> .
|
Loading…
Reference in New Issue