const FAIL = message => { throw Error(message); };
const ReifiedObjectOrdinaryCreateFromCase = (
TargetTypeOrDeferredType,
TargetTypeDefinition,
TargetCaseName,
TargetCaseDefinition,
CalleeArguments) => /*(console.log("HERE",TargetTypeOrDeferredType,
TargetTypeDefinition,
TargetCaseName,
TargetCaseDefinition,
CalleeArguments), */ReifiedObjectClaim(
ToBridgePrototype("BLAH"),
/*GetInstanceData(TargetTypeDefinition)
.casePrototypes
.get(TargetCaseName),*/
TargetTypeOrDeferredType,
null,//TargetTypeDefinition,
TargetCaseName,
{ I_AM_A_TYPE: "hello" }, //CalleeArguments[0],
/*
ToUnreachablePlatformNucleusFromCase(
TargetCaseDefinition,
CalleeArguments),*/
null,
null);//);
const ReifiedObjectCreateFromCase = (
TargetType,
TargetCaseName,
CalleeNewTarget,
CalleeArguments) => given((
TargetTypeDefinition = GetInstanceData(TargetType).definition,
{ name, cases } = GetInstanceData(TargetType).definition,
TypeCaseName = TargetCaseName ? `${name}.${TargetCaseName}` : name,
isInstantiable =
cases.size > 0 || FAIL(`type ${name} is not an instantiable type.`),
//cases.count > 0 || FAIL(`type ${name} is not an instantiable type.`),
hasConstructor =
cases.has(TargetCaseName) ||
FAIL(`type ${name} has no case named "${TargetCaseName}"`),
invokedCorrectly =
!CalleeNewTarget ||
FAIL(`Don't invoke ${TypeCaseName} with "new".`),
TargetCaseConstructor = ReifiedObjectOrdinaryCreateFromCase) =>
TargetCaseConstructor(
[TargetType],
TargetTypeDefinition,
TargetCaseName,
null,//TargetCaseDefinition,
CalleeArguments));
// REMEMBER, NONE OF THE TYPES EXIST AT PROVISION TIME!!!! WE CREATE WITHOUT THEM
const [Type, PrimitiveTypes] = given((
// Name convenience functions.
ToTypeDisplayName = given((
DigitSubscripts = "₀₁₂₃₄₅₆₇₈₉",
ToLevelSubscript = L => (L + "")
.replace(/\d/g, d => DigitSubscripts[d])) =>
(TypeLevel, TypeName) => TypeLevel === 0 ?
TypeName :
`${TypeName}${ToLevelSubscript(TypeLevel)}`),
ToTypeCaseDisplayName = (TypeLevel, TypeName, CaseName) =>
CaseName === "" ?
ToTypeDisplayName(TypeLevel, TypeName) :
`${ToTypeDisplayName(TypeLevel, TypeName)}.${CaseName}`,
ReifiedObjectBootstrapCreateFromCase = (
TypeLevel,
TypeName,
CaseName,
InternalData,
Nucleus) => ReifiedObjectClaim(
ToBridgePrototype("YIKES_" + TypeName + " " + CaseName + " " + TypeLevel),
[false, [TypeLevel, TypeName]],
CaseName,
InternalData,
Nucleus),
// ToType𝑝 = (TypeLevel, TypeSchema) =>
// Begin provisional constructors.
IsNotPrimaryCase = CaseName => CaseName !== "",
ToExpandedTypeSchema = schema => given((
{ primaryCaseEntry, namedCasesEntries } =
ObjectGroupBy(
ObjectEntries(schema.cases),
([key]) => IsNotPrimaryCase(key) ?
"namedCasesEntries" :
"primaryCaseEntry"),
primaryCase = !!primaryCaseEntry && primaryCaseEntry[0][1],
namedCases = ObjectFromEntries(namedCasesEntries || [])) =>
({ ...schema, primaryCase, namedCases })),
{ TypeSchemas, TypeFunctionSchemas } = ObjectMap(ObjectGroupBy(
ObjectEntries(
ObjectMap(BootstrapTypeSchemas, ToExpandedTypeSchema)),
([, TypeSchema]) =>
ObjectHasOwn(TypeSchema, "parameters") ?
"TypeFunctionSchemas" :
"TypeSchemas"),
ObjectFromEntries),
ToEncodedCaseConstructor = (EncodedType, CaseName, PropertiesToCopy) =>
ToImmutableFunction(`${EncodedType[1]}.${CaseName}`,
Nucleus => [...EncodedType, CaseName, Nucleus],
PropertiesToCopy),
ToEncodedTypeShorthand = (EncodedType, cases) => given((
NamedConstructors = ObjectFilterKeys(cases, IsNotPrimaryCase)) =>
ToEncodedCaseConstructor(EncodedType, "",
ObjectMap(NamedConstructors, (_, CaseName) =>
ToEncodedCaseConstructor(EncodedType, CaseName)))),
ToTypeNoPrimaryCaseErrorConstructor𝑝 =
(TypeLevel, TypeName, CaseName, PropertiesToCopy) =>
ToImmutableFunction(
ToTypeCaseDisplayName(TypeLevel, TypeName, ""),
() => FAIL(ToTypeCaseDisplayName(TypeLevel, TypeName, "") + "HAS NO PRIMARY CASE"),
PropertiesToCopy),
ToTypeCaseConstructor𝑝 =
(TypeLevel, TypeName, CaseName, PropertiesToCopy) =>(console.log(TypeLevel, TypeName, CaseName, PropertiesToCopy, "----"),
ToImmutableFunction(
ToTypeCaseDisplayName(TypeLevel, TypeName, CaseName),
RawObjectNucleus => ReifiedObjectClaim(
// We nest this because we want to simulate the
// CasePrototype/TypePrototype structure you normally get.
ToBridgePrototype(ToTypeCaseDisplayName(TypeLevel, TypeName, CaseName)),
[false, [TypeLevel, TypeName]],
CaseName,
null,
RawObjectNucleus),
PropertiesToCopy)),
ToType𝑝 = TypeLevel => (TypeSchema, TypeName) =>
(TypeSchema.primaryCase ?
ToTypeCaseConstructor𝑝 :
ToTypeNoPrimaryCaseErrorConstructor𝑝)
(TypeLevel, TypeName, "",
ObjectMap(TypeSchema.namedCases, (_, CaseName) =>
ToTypeCaseConstructor𝑝(TypeLevel, TypeName, CaseName))),
GetTypeUniverse𝑝 = given((
TypeUniverses𝑝 = ObjectCreate(null),
TypeUniverseCreate𝑝 = TypeLevel =>
ObjectMap(TypeSchemas, ToType𝑝(TypeLevel)),
GetTypeUniverse𝑝 = TypeLevel => GetOrSetOwnProperty(
TypeUniverses𝑝,
TypeLevel,
TypeUniverseCreate𝑝)) =>
GetTypeUniverse𝑝),
_ = console.log(TypeSchemas, TypeFunctionSchemas),
__ = console.log(GetTypeUniverse𝑝(1).TypeDefinition({ name: "SOmething", cases: new Map() })),
/*
GetProvisionalTypeUniverse = given((
{ TypeSchemas, TypeFunctionSchemas } = ObjectGroupBy(
ObjectEntries(BootstrapTypeSchemas),
([, TypeSchema]) =>
ObjectHasOwn(TypeSchema, "parameters") ?
"TypeFunctionSchemas" :
"TypeSchemas")) =>
ToProvisionalTypeUniverse = TypeLevel => */
//_ = console.log(TypeSchemas, TypeFunctionSchemas),
TypeDefinition𝑝 = (TypeLevel, name, cases) =>
ReifiedObjectBootstrapCreateFromCase(
TypeLevel, "TypeDefinition", "", null, { name, cases }),
[GetTypeUniverse, PrimitiveTypes] = given((
TypeUniverses = ObjectCreate(null),
TypeUniverseCreate = TypeLevel => given((
TypeDisplayName = ToTypeDisplayName(TypeLevel, "Type"),
Type = ToUnreachablePlatformFunction(
"CONSTRUCTOR",
ToTypeDisplayName(TypeLevel, "Type"),
(NewTarget, ...args) => (console.log(`IN ${TypeDisplayName} constructor`),
ReifiedObjectCreateFromCase(Type, "", NewTarget, args)))) =>
ReifiedObjectClaim(
// We nest this because we want to simulate the
// CasePrototype/TypePrototype structure you normally get.
ToBridgePrototype(TypeDisplayName),
[false, [TypeLevel + 1, "Type"]],
"",
{ definition: TypeDefinition𝑝(TypeLevel, "Type", new Map([["", {}]])) },
Type)),
Type0 = TypeUniverseCreate(0),
PrimitiveTypes = ObjectFromEntries(ArrayF.map(
PrimitiveTypeNames,
PrimitiveTypeName => [
PrimitiveTypeName,
Type0(TypeDefinition𝑝(0, PrimitiveTypeName, new Map()))])),
GetTypeUniverse = TypeLevel => GetOrSetOwnProperty(
TypeUniverses,
TypeLevel,
TypeUniverseCreate)) =>
[GetTypeUniverse, PrimitiveTypes])) =>
[GetTypeUniverse, PrimitiveTypes]);
x = Type(0)("hi")