/#
  This Source Code Form is subject to the terms of the Mozilla Public
  License, v. 2.0. If a copy of the MPL was not distributed with this
  file, You can obtain one at http://mozilla.org/MPL/2.0/.
#/



/## _LIB_TABLE
	The array of library export trees.

	Convention:
		- index 0 is always reserved for language-specific types + libtnsl
		- index 0 module 0 represents the fundimental in-built types like int
#/
: extern const {}~library _LIB_TABLE

; raw struct library {
	# Version
	uint16
		major,
		minor,
		patch

	~sym_node
		root_node
}

/## tnsl.reflect._method
	Metadata for methods (can be decoded from library
	symbol tables).  Limits for methods defined here:
	- Max 2^8 inputs
	- Max 2^8 outputs
#/
; raw struct _method {
	{uint8}charp
		name,
	
	{uint8}~_type
		inputs,
		outputs,

	~void
		address
}

/## tnsl.reflect._member
	Metadata about struct members
#/
; raw struct _member {
	{uint8}charp
		name,
	
	_type
		member_type,

	uint
		byte_offset
}

/## tnsl.reflect.sym_node
	Represents a module in a symbol tree
#/
; raw struct sym_node {
	{uint8}charp
		name,
	
	uint16
		id,
	
	{}~sym_node
		sub_modules,

	{}~sym_type
		sub_types
}

/## tnsl.reflect.sym_type
	Represents a type in a symbol tree
#/
; raw struct sym_type {
	{uint8}charp
		name,
	
	{uint8}~sym_type
		super_types,

}

###############################
#  Traverse the Library Tree  #
###############################

/; get_sym_node (~sym_node root, uint16 mod_id) [~sym_node]
	/;loop (root != null)
		/; loop (uint16 sub = 0; sub < len `root.sub_modules) [sub++]
			/; if (mod_id < `root.sub_modules{sub}.id)
				/; if (sub == 0)
					; return null
				;/
				;root = `root.sub_modules{sub - 1}
				; continue 1
			;; else if (mod_id == `root.sub_modules{sub}.id)
				; return `root.sub_modules{sub}
			;/
		;/

		; break
	;/

	; return null
;/

/; get_sym_node (uint16 lib_id, mod_id) [~sym_node]

	;~library lib = _LIB_TABLE{lib_id}

	;return get_sym_node(`lib.root_node, mod_id)
;/

/; get_sym_type(uint16 lib_id, mod_id, typ_id) [~sym_type]

	;~library lib = _LIB_TABLE{lib_id}
	;~sym_node mod = get_sym_node(`lib.root_node, mod_id)

	;return `mod.sub_types{typ_id}
;/

/; get_sym_type(`const {}charp path) [~sym_type]

;/