@@ -32,6 +32,7 @@ export function assert(value: unknown, message?: string): asserts value {
3232}
3333
3434export let unwrap_html : ( value : HTML ) => { _statics : TemplateStringsArray ; _dynamics : unknown [ ] }
35+ export let unwrap_keyed : ( value : Keyed ) => Key
3536
3637export class HTML {
3738 #statics: TemplateStringsArray
@@ -58,20 +59,26 @@ export function single_part_template(part: Displayable): HTML {
5859}
5960
6061export type Key = string | number | bigint | boolean | symbol | object | null
61- export interface Keyed extends Renderable {
62- [ keyed_tag ] : true
63- /** @internal */ _key : Key
62+
63+ export class Keyed implements Renderable {
64+ #key: Key
65+ #displayable: Displayable
66+ constructor ( displayable : Displayable , key : Key ) {
67+ this . #key = key
68+ this . #displayable = displayable
69+ }
70+ render ( ) : Displayable {
71+ return this . #displayable
72+ }
73+ static {
74+ unwrap_keyed = value => value . #key
75+ }
6476}
6577
66- const keyed_tag : unique symbol = Symbol ( )
6778export function keyed ( displayable : Displayable , key : Key ) : Keyed {
68- return {
69- [ keyed_tag ] : true ,
70- _key : key ,
71- render : ( ) => displayable ,
72- }
79+ return new Keyed ( displayable , key )
7380}
7481
75- export function is_keyed ( value : any ) : value is Keyed {
76- return typeof value === 'object' && value !== null && keyed_tag in value
82+ export function is_keyed ( value : unknown ) : value is Keyed {
83+ return value instanceof Keyed
7784}
0 commit comments