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,
|
export Actor, Assertion, Facet, Handle, Ref, Symbol, Turn, TurnAction,
|
||||||
`$`, addCallback, analyse, asyncCheck, bootDataspace,
|
`$`, addCallback, analyse, asyncCheck, bootDataspace,
|
||||||
facet, future, inFacet, message, newDataspace, onStop, publish,
|
facet, future, inFacet, message, newDataspace, onStop, publish,
|
||||||
retract, replace, run, stop, unembed
|
retract, replace, run, stop, unembed, unpackLiterals
|
||||||
|
|
||||||
proc `!`*(typ: static typedesc): Pattern {.inline.} =
|
proc `!`*(typ: static typedesc): Pattern {.inline.} =
|
||||||
patterns.dropType(typ)
|
patterns.dropType(typ)
|
||||||
|
|
|
@ -212,7 +212,7 @@ proc grabDict*(): Pattern =
|
||||||
proc unpackLiterals*[E](pr: Preserve[E]): Preserve[E] =
|
proc unpackLiterals*[E](pr: Preserve[E]): Preserve[E] =
|
||||||
result = pr
|
result = pr
|
||||||
apply(result) do (pr: var Preserve[E]):
|
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]
|
pr = pr.record[0]
|
||||||
|
|
||||||
proc inject*(pat: Pattern; bindings: openArray[(int, Pattern)]): Pattern =
|
proc inject*(pat: Pattern; bindings: openArray[(int, Pattern)]): Pattern =
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Package
|
# Package
|
||||||
|
|
||||||
version = "20230608"
|
version = "20230610"
|
||||||
author = "Emery Hemingway"
|
author = "Emery Hemingway"
|
||||||
description = "Syndicated actors for conversational concurrency"
|
description = "Syndicated actors for conversational concurrency"
|
||||||
license = "Unlicense"
|
license = "Unlicense"
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
include_rules
|
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