11import type { ResolvedSnippet } from '../../data/snippet.ts' ;
2- import { type NameRegistry , RandomNameRegistry , StrictNameRegistry } from '../../nameRegistry.ts' ;
3- import { getName } from '../../shared/meta.ts' ;
2+ import { bannedTokens , builtins } from '../../nameUtils.ts' ;
43import { $internal } from '../../shared/symbols.ts' ;
54import { ShelllessRepository } from '../../tgsl/shellless.ts' ;
65import type { TgpuLazy , TgpuSlot } from '../slot/slotTypes.ts' ;
76
87type SlotToValueMap = Map < TgpuSlot < unknown > , unknown > ;
98
109export interface NamespaceInternal {
11- readonly nameRegistry : NameRegistry ;
10+ readonly takenGlobalIdentifiers : Set < string > ;
1211 readonly shelllessRepo : ShelllessRepository ;
12+ readonly strategy : 'random' | 'strict' ;
1313
1414 memoizedResolves : WeakMap <
1515 // WeakMap because if the item does not exist anymore,
@@ -24,73 +24,32 @@ export interface NamespaceInternal {
2424 TgpuLazy < unknown > ,
2525 { slotToValueMap : SlotToValueMap ; result : unknown } [ ]
2626 > ;
27-
28- listeners : {
29- [ K in keyof NamespaceEventMap ] : Set < ( event : NamespaceEventMap [ K ] ) => void > ;
30- } ;
3127}
3228
33- type NamespaceEventMap = {
34- name : { target : object ; name : string } ;
35- } ;
36-
37- type DetachListener = ( ) => void ;
38-
3929export interface Namespace {
4030 readonly [ $internal ] : NamespaceInternal ;
41-
42- on < TEvent extends keyof NamespaceEventMap > (
43- event : TEvent ,
44- listener : ( event : NamespaceEventMap [ TEvent ] ) => void ,
45- ) : DetachListener ;
4631}
4732
4833class NamespaceImpl implements Namespace {
4934 readonly [ $internal ] : NamespaceInternal ;
5035
51- constructor ( nameRegistry : NameRegistry ) {
36+ constructor ( strategy : 'random' | 'strict' ) {
5237 this [ $internal ] = {
53- nameRegistry,
38+ strategy,
39+ takenGlobalIdentifiers : new Set ( [ ...bannedTokens , ...builtins ] ) ,
5440 shelllessRepo : new ShelllessRepository ( ) ,
5541 memoizedResolves : new WeakMap ( ) ,
5642 memoizedLazy : new WeakMap ( ) ,
57- listeners : {
58- name : new Set ( ) ,
59- } ,
6043 } ;
6144 }
62-
63- on < TEvent extends keyof NamespaceEventMap > (
64- event : TEvent ,
65- listener : ( event : NamespaceEventMap [ TEvent ] ) => void ,
66- ) : DetachListener {
67- if ( event === 'name' ) {
68- const listeners = this [ $internal ] . listeners . name ;
69- listeners . add ( listener ) ;
70-
71- return ( ) => listeners . delete ( listener ) ;
72- }
73-
74- throw new Error ( `Unsupported event: ${ event } ` ) ;
75- }
7645}
7746
7847export interface NamespaceOptions {
7948 names ?: 'random' | 'strict' | undefined ;
8049}
8150
82- export function getUniqueName ( namespace : NamespaceInternal , resource : object ) : string {
83- const name = namespace . nameRegistry . makeUnique ( getName ( resource ) , true ) ;
84- for ( const listener of namespace . listeners . name ) {
85- listener ( { target : resource , name } ) ;
86- }
87- return name ;
88- }
89-
9051export function namespace ( options ?: NamespaceOptions ) : Namespace {
9152 const { names = 'strict' } = options ?? { } ;
9253
93- return new NamespaceImpl (
94- names === 'strict' ? new StrictNameRegistry ( ) : new RandomNameRegistry ( ) ,
95- ) ;
54+ return new NamespaceImpl ( names ) ;
9655}
0 commit comments