/** */ interface type_element extends lib_plankton.call.type_coproduct { } /** */ let element_kind_pool : Record< string, ( ( data : any, make : ((raw : any) => type_element) ) => type_element ) > = {}; /** */ function element_kind_register( name : string, factory : ( (data : any, make : ((raw : any) => type_element)) => type_element ) ) : void { if (name in element_kind_pool) { throw (new Error("kind '" + name + "' already registered")); } else { element_kind_pool[name] = factory; } } /** */ function element_make( raw : any ) : type_element { if (! (raw["kind"] in element_kind_pool)) { throw (new Error("kind '" + raw["kind"] + "' not registered")); } else { return element_kind_pool[raw["kind"]](raw["data"], element_make); } }