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((
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),
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")