/* type type_element_text = { content : string; }; type type_element_group = { members : Array; }; type type_element = ( type_element_text | type_element_group ); */ /** */ interface type_element { render_html( ) : string ; } /** */ 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); } }