function Util.MakeSequenceType(F)F=F or{}assert(F.Parse~=nil or F.Constructor~=nil,"\077\097\107\101\083\101\113\117\101\110\099\101\084\121\112\101\058 \077\117\115\116 \112\114\111\118\105\100\101 \111\110\101 \111\102\058 \067\111\110\115\116\114\117\099\116\111\114\044 \080\097\114\115\101")F.TransformEach=F.TransformEach or function(...)return...end F.ValidateEach=F.ValidateEach or function()return true end return{Prefixes=F.Prefixes;Transform=function(c)return Util.Map(Util.SplitPrioritizedDelimeter(c,{"\044","\037\115"}),function(c)return F.TransformEach(c)end)end,Validate=function(c)if F.Length and#c>F.Length then return false,("\077\097\120\105\109\117\109 \111\102 \037\100 \118\097\108\117\101\115 \097\108\108\111\119\101\100 \105\110 \115\101\113\117\101\110\099\101"):format(F.Length)end for b=1,F.Length or#c,1 do local D,W=F.ValidateEach(c[b],b)if not D then return false,W end end return true end,Parse=F.Parse or function(c)return F.Constructor(unpack(c))end}end
--- Makes a type that contains a sequence, e.g. Vector3 or Color3
function Util.MakeSequenceType(options)
	options = options or {}

	assert(
		options.Parse ~= nil or options.Constructor ~= nil,
		"MakeSequenceType: Must provide one of: Constructor, Parse"
	)

	options.TransformEach = options.TransformEach or function(...)
		return ...
	end

	options.ValidateEach = options.ValidateEach or function()
		return true
	end

	return {
		Prefixes = options.Prefixes,

		Transform = function(text)
			return Util.Map(Util.SplitPrioritizedDelimeter(text, { ",", "%s" }), function(value)
				return options.TransformEach(value)
			end)
		end,

		Validate = function(components)
			if options.Length and #components > options.Length then
				return false, ("Maximum of %d values allowed in sequence"):format(options.Length)
			end

			for i = 1, options.Length or #components do
				local valid, reason = options.ValidateEach(components[i], i)

				if not valid then
					return false, reason
				end
			end

			return true
		end,

		Parse = options.Parse or function(components)
			return options.Constructor(unpack(components))
		end,
	}
end
