local l=require(script.Parent.Symbol)local O=require(script.Parent.strict)local h=require(script.Parent.Portal)local A=newproxy(true)local K={Portal=l.named("\080\111\114\116\097\108");Host=l.named("\072\111\115\116");Function=l.named("\070\117\110\099\116\105\111\110");Stateful=l.named("\083\116\097\116\101\102\117\108")}function K.of(l)if typeof(l)~="\116\097\098\108\101"then return nil end return l[A]end local Q={string=K.Host;["\102\117\110\099\116\105\111\110"]=K.Function;table=K.Stateful}function K.fromComponent(l)if l==h then return A.Portal else return Q[typeof(l)]end end;(getmetatable(A)).__index=K O(K,"\069\108\101\109\101\110\116\075\105\110\100")return A
--[[
	Contains markers for annotating the type of an element.

	Use `ElementKind` as a key, and values from it as the value.

		local element = {
			[ElementKind] = ElementKind.Host,
		}
]]

local Symbol = require(script.Parent.Symbol)
local strict = require(script.Parent.strict)
local Portal = require(script.Parent.Portal)

local ElementKind = newproxy(true)

local ElementKindInternal = {
	Portal = Symbol.named("Portal"),
	Host = Symbol.named("Host"),
	Function = Symbol.named("Function"),
	Stateful = Symbol.named("Stateful"),
}

function ElementKindInternal.of(value)
	if typeof(value) ~= "table" then
		return nil
	end

	return value[ElementKind]
end

local componentTypesToKinds = {
	["string"] = ElementKindInternal.Host,
	["function"] = ElementKindInternal.Function,
	["table"] = ElementKindInternal.Stateful,
}

function ElementKindInternal.fromComponent(component)
	if component == Portal then
		return ElementKind.Portal
	else
		return componentTypesToKinds[typeof(component)]
	end
end

getmetatable(ElementKind).__index = ElementKindInternal

strict(ElementKindInternal, "ElementKind")

return ElementKind
