public static NIType AddGenericDataTypeParameter(NIFunctionBuilder functionBuilder, string name, params NITypeBuilder[] constraints) { var genericTypeParameters = functionBuilder.MakeGenericParameters(name); NITypeBuilder typeBuilder = genericTypeParameters.ElementAt(0); // HACK, but there seems to be no other public way to add constraints to an NITypeBuilder List <NITypeBuilder> builderConstraints = (List <NITypeBuilder>)((NIGenericTypeBuilder)typeBuilder).Constraints; builderConstraints.AddRange(constraints); return(typeBuilder.CreateType()); }
static Signatures() { NITypeBuilder displayTraitConstraintBuilder = NITypes.Factory.DefineValueInterface("Display"); NITypeBuilder copyTraitConstraintBuilder = NITypes.Factory.DefineValueInterface("Copy"); NITypeBuilder cloneTraitConstraintBuilder = NITypes.Factory.DefineReferenceInterface("Clone"); var functionTypeBuilder = NITypes.Factory.DefineFunction("ImmutPass"); var tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); ImmutablePassthroughType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("MutPass"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); MutablePassthroughType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("Assign"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "assigneeRef"); AddInput( functionTypeBuilder, tDataParameter, "value"); AssignType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("Exchange"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); var tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateMutableReference(tLifetimeParameter), "exchangeeRef1"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateMutableReference(tLifetimeParameter), "exchangeeRef2"); ExchangeValuesType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("CreateCopy"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData", cloneTraitConstraintBuilder); AddInputOutput( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); AddOutput( functionTypeBuilder, tDataParameter, "copy"); CreateCopyType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("Drop"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "T"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); DropType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("Output"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData", displayTraitConstraintBuilder); AddInputOutput( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); OutputType = functionTypeBuilder.CreateType(); { functionTypeBuilder = NITypes.Factory.DefineFunction("IteratorNext"); // Technically, the TIterator type should have an Iterator interface constraint related to TItem. // This signature is only being used by IterateTunnel currently, which does not need the constraint for type inference; // once this becomes a standalone diagram node, the constraint will be necessary for type inference. NIType iteratorType = AddGenericDataTypeParameter(functionTypeBuilder, "TIterator"); NIType itemType = AddGenericDataTypeParameter(functionTypeBuilder, "TItem"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInputOutput( functionTypeBuilder, iteratorType.CreateMutableReference(tLifetimeParameter), "iteratorRef"); AddOutput( functionTypeBuilder, itemType.CreateOption(), "item"); IteratorNextType = functionTypeBuilder.CreateType(); } functionTypeBuilder = NITypes.Factory.DefineFunction("Inspect"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); InspectType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("FakeDropCreate"); AddInput( functionTypeBuilder, NITypes.Int32, "id"); AddOutput( functionTypeBuilder, DataTypes.FakeDropType, "fakeDrop"); FakeDropCreateType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("SelectReference"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, NITypes.Boolean.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "selectorRef"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2"); var tMutabilityParameter = AddGenericMutabilityTypeParameter(functionTypeBuilder, "TMut"); var referenceType = tDataParameter.CreatePolymorphicReference(tLifetimeParameter, tMutabilityParameter); AddInput( functionTypeBuilder, referenceType, "trueValueRef"); AddInput( functionTypeBuilder, referenceType, "falseValueRef"); AddOutput( functionTypeBuilder, referenceType, "selectedValueRef"); SelectReferenceType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("Range"); AddInput( functionTypeBuilder, NITypes.Int32, "lowValue"); AddInput( functionTypeBuilder, NITypes.Int32, "highValue"); AddOutput( functionTypeBuilder, DataTypes.RangeIteratorType, "range"); RangeType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("Some"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInput( functionTypeBuilder, tDataParameter, "value"); AddOutput( functionTypeBuilder, tDataParameter.CreateOption(), "option"); SomeConstructorType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("None"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddOutput( functionTypeBuilder, tDataParameter.CreateOption(), "option"); NoneConstructorType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("UnwrapOption"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInput( functionTypeBuilder, tDataParameter.CreateOption(), "option"); AddOutput( functionTypeBuilder, tDataParameter, "value"); UnwrapOptionType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("OptionToPanicResult"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInput( functionTypeBuilder, tDataParameter.CreateOption(), "option"); AddOutput( functionTypeBuilder, tDataParameter.CreatePanicResult(), "panicResult"); OptionToPanicResultType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("StringFromSlice"); AddInputOutput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "slice"); AddOutput( functionTypeBuilder, NITypes.String, "string"); StringFromSliceType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("StringToSlice"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInput( functionTypeBuilder, NITypes.String.CreateImmutableReference(tLifetimeParameter), "string"); AddOutput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(tLifetimeParameter), "slice"); StringToSliceType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("StringConcat"); AddInputOutput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "firstSlice"); AddInputOutput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "secondSlice"); AddOutput( functionTypeBuilder, NITypes.String, "combined"); StringConcatType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("StringAppend"); AddInputOutput( functionTypeBuilder, NITypes.String.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "string"); AddInputOutput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "slice"); StringAppendType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("StringSliceToStringSplitIterator"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(tLifetimeParameter), "slice"); AddOutput( functionTypeBuilder, tLifetimeParameter.CreateStringSplitIterator(), "iterator"); StringSliceToStringSplitIteratorType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("StringFromByteSlice"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInputOutput( functionTypeBuilder, NITypes.UInt8.CreateSlice().CreateImmutableReference(tLifetimeParameter), "byteSliceRef"); AddOutput( functionTypeBuilder, NITypes.String, "string"); StringFromByteSliceType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("VectorCreate"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddOutput( functionTypeBuilder, tDataParameter.CreateVector(), "vector"); VectorCreateType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("VectorInitialize"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData", copyTraitConstraintBuilder); AddInput(functionTypeBuilder, tDataParameter, "element"); AddInput(functionTypeBuilder, NITypes.Int32, "size"); AddOutput( functionTypeBuilder, tDataParameter.CreateVector(), "vector"); VectorInitializeType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("VectorToSlice"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TElem"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); tMutabilityParameter = AddGenericMutabilityTypeParameter(functionTypeBuilder, "TMut"); AddInput( functionTypeBuilder, tDataParameter.CreateVector().CreatePolymorphicReference(tLifetimeParameter, tMutabilityParameter), "vectorRef"); AddOutput( functionTypeBuilder, tDataParameter.CreateSlice().CreatePolymorphicReference(tLifetimeParameter, tMutabilityParameter), "sliceRef"); VectorToSliceType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("VectorAppend"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateVector().CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "vectorRef"); AddInput(functionTypeBuilder, tDataParameter, "element"); VectorAppendType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("VectorInsert"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateVector().CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "vectorRef"); AddInputOutput( functionTypeBuilder, NITypes.Int32.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "indexRef"); AddInput( functionTypeBuilder, tDataParameter, "elementRef"); VectorInsertType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("VectorRemoveLast"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutput( functionTypeBuilder, tDataParameter.CreateVector().CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "vectorRef"); AddOutput(functionTypeBuilder, tDataParameter.CreateOption(), "element"); VectorRemoveLastType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("SliceIndex"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TElem"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); tMutabilityParameter = AddGenericMutabilityTypeParameter(functionTypeBuilder, "TMut"); AddInputOutput( functionTypeBuilder, NITypes.Int32.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "indexRef"); AddInput( functionTypeBuilder, tDataParameter.CreateSlice().CreatePolymorphicReference(tLifetimeParameter, tMutabilityParameter), "sliceRef"); AddOutput( functionTypeBuilder, tDataParameter.CreatePolymorphicReference(tLifetimeParameter, tMutabilityParameter).CreateOption(), "elementRef"); SliceIndexType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("SliceToIterator"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TElem"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInput( functionTypeBuilder, tDataParameter.CreateSlice().CreateImmutableReference(tLifetimeParameter), "sliceRef"); AddOutput( functionTypeBuilder, tDataParameter.CreateSliceIterator(tLifetimeParameter), "iterator"); SliceToIteratorType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("SliceToMutableIterator"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TElem"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInput( functionTypeBuilder, tDataParameter.CreateSlice().CreateMutableReference(tLifetimeParameter), "sliceRef"); AddOutput( functionTypeBuilder, tDataParameter.CreateSliceMutableIterator(tLifetimeParameter), "iterator"); SliceToMutableIteratorType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("CreateLockingCell"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInput( functionTypeBuilder, tDataParameter, "value"); AddOutput( functionTypeBuilder, tDataParameter.CreateLockingCell(), "cell"); CreateLockingCellType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("SharedCreate"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInput( functionTypeBuilder, tDataParameter, "value"); AddOutput( functionTypeBuilder, tDataParameter.CreateShared(), "shared"); SharedCreateType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("SharedGetValue"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInput( functionTypeBuilder, tDataParameter.CreateShared().CreateImmutableReference(tLifetimeParameter), "sharedRef"); AddOutput( functionTypeBuilder, tDataParameter.CreateImmutableReference(tLifetimeParameter), "valueRef"); SharedGetValueType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("OpenFileHandle"); AddInputOutput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "filePathRef"); AddOutput( functionTypeBuilder, DataTypes.FileHandleType.CreateOption(), "fileHandle"); OpenFileHandleType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("ReadLineFromFileHandle"); AddInputOutput( functionTypeBuilder, DataTypes.FileHandleType.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "fileHandleRef"); AddOutput( functionTypeBuilder, NITypes.String.CreateOption(), "line"); ReadLineFromFileHandleType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("WriteStringToFileHandle"); AddInputOutput( functionTypeBuilder, DataTypes.FileHandleType.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "fileHandleRef"); AddInputOutput( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "dataRef"); WriteStringToFileHandleType = functionTypeBuilder.CreateType(); { functionTypeBuilder = NITypes.Factory.DefineFunction("Poll"); NIType promiseType = AddGenericDataTypeParameter(functionTypeBuilder, "TPromise"); NIType valueType = AddGenericDataTypeParameter(functionTypeBuilder, "TValue"); AddInputOutput( functionTypeBuilder, promiseType.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "promiseRef"); AddInput( functionTypeBuilder, DataTypes.WakerType, "waker"); AddOutput( functionTypeBuilder, valueType.CreateOption(), "result"); PromisePollType = functionTypeBuilder.CreateType(); } functionTypeBuilder = NITypes.Factory.DefineFunction("Yield"); AddInputOutput( functionTypeBuilder, AddGenericDataTypeParameter(functionTypeBuilder, "T").CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); YieldType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("CreateYieldPromise"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "T"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInput( functionTypeBuilder, tDataParameter.CreateImmutableReference(tLifetimeParameter), "valueRef"); AddOutput( functionTypeBuilder, tDataParameter.CreateImmutableReference(tLifetimeParameter).CreateYieldPromise(), "promise"); CreateYieldPromiseType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("CreateNotifierPair"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "T"); AddOutput( functionTypeBuilder, tDataParameter.CreateNotifierReader(), "reader"); AddOutput( functionTypeBuilder, tDataParameter.CreateNotifierWriter(), "writer"); CreateNotifierPairType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("GetNotifierValue"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "T"); AddInput( functionTypeBuilder, tDataParameter.CreateNotifierReader(), "reader"); AddOutput( functionTypeBuilder, tDataParameter.CreateOption(), "value"); GetNotifierValueType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("GetReaderPromise"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "T"); AddInput( functionTypeBuilder, tDataParameter.CreateNotifierReader(), "reader"); AddOutput( functionTypeBuilder, tDataParameter.CreateNotifierReaderPromise(), "promise"); GetReaderPromiseType = functionTypeBuilder.CreateType(); functionTypeBuilder = NITypes.Factory.DefineFunction("SetNotifierValue"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "T"); AddInput( functionTypeBuilder, tDataParameter.CreateNotifierWriter(), "writer"); AddInput( functionTypeBuilder, tDataParameter, "value"); SetNotifierValueType = functionTypeBuilder.CreateType(); }
static Signatures() { var functionTypeBuilder = PFTypes.Factory.DefineFunction("ImmutPass"); var tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); ImmutablePassthroughType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("MutPass"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); MutablePassthroughType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("Assign"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "assigneeRef"); AddInputParameter( functionTypeBuilder, tDataParameter, "value"); AssignType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("Exchange"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); var tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateMutableReference(tLifetimeParameter), "exchangeeRef1"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateMutableReference(tLifetimeParameter), "exchangeeRef2"); ExchangeValuesType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("CreateCopy"); // TODO: constrain TData to be Copy or Clone tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); AddOutputParameter( functionTypeBuilder, tDataParameter, "copy"); CreateCopyType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("Output"); NITypeBuilder displayTraitConstraintBuilder = PFTypes.Factory.DefineValueInterface("Display"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData", displayTraitConstraintBuilder); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); OutputType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("Inspect"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "valueRef"); InspectType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("SelectReference"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutputParameter( functionTypeBuilder, PFTypes.Boolean.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "selectorRef"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2"); var tMutabilityParameter = AddGenericMutabilityTypeParameter(functionTypeBuilder, "TMut"); var referenceType = tDataParameter.CreatePolymorphicReference(tLifetimeParameter, tMutabilityParameter); AddInputParameter( functionTypeBuilder, referenceType, "trueValueRef"); AddInputParameter( functionTypeBuilder, referenceType, "falseValueRef"); AddOutputParameter( functionTypeBuilder, referenceType, "selectedValueRef"); SelectReferenceType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("Range"); AddInputParameter( functionTypeBuilder, PFTypes.Int32, "lowValue"); AddInputParameter( functionTypeBuilder, PFTypes.Int32, "highValue"); AddOutputParameter( functionTypeBuilder, DataTypes.RangeIteratorType, "range"); RangeType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("Some"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputParameter( functionTypeBuilder, tDataParameter, "value"); AddOutputParameter( functionTypeBuilder, tDataParameter.CreateOption(), "option"); SomeConstructorType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("None"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddOutputParameter( functionTypeBuilder, tDataParameter.CreateOption(), "option"); NoneConstructorType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("StringFromSlice"); AddInputOutputParameter( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "slice"); AddOutputParameter( functionTypeBuilder, PFTypes.String, "string"); StringFromSliceType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("StringToSlice"); tLifetimeParameter = AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife"); AddInputParameter( functionTypeBuilder, PFTypes.String.CreateImmutableReference(tLifetimeParameter), "string"); AddOutputParameter( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(tLifetimeParameter), "slice"); StringToSliceType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("StringConcat"); AddInputOutputParameter( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "firstSlice"); AddInputOutputParameter( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "secondSlice"); AddOutputParameter( functionTypeBuilder, PFTypes.String, "combined"); StringConcatType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("StringAppend"); AddInputOutputParameter( functionTypeBuilder, PFTypes.String.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "string"); AddInputOutputParameter( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "slice"); StringAppendType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("VectorCreate"); // TODO #if FALSE genericTypeParameters = functionTypeBuilder.MakeGenericParameters( "TData"); tDataParameter = genericTypeParameters.ElementAt(0).CreateType(); #endif AddOutputParameter( functionTypeBuilder, PFTypes.Int32.CreateVector(), "vector"); VectorCreateType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("VectorInsert"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputOutputParameter( functionTypeBuilder, tDataParameter.CreateVector().CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "vectorRef"); AddInputOutputParameter( functionTypeBuilder, PFTypes.Int32.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "indexRef"); AddInputParameter( functionTypeBuilder, tDataParameter, "elementRef"); VectorInsertType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("CreateLockingCell"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputParameter( functionTypeBuilder, tDataParameter, "value"); AddOutputParameter( functionTypeBuilder, tDataParameter.CreateLockingCell(), "cell"); CreateLockingCellType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("CreateNonLockingCell"); tDataParameter = AddGenericDataTypeParameter(functionTypeBuilder, "TData"); AddInputParameter( functionTypeBuilder, tDataParameter, "value"); AddOutputParameter( functionTypeBuilder, tDataParameter.CreateNonLockingCell(), "cell"); CreateNonLockingCellType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("OpenFileHandle"); AddInputOutputParameter( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "filePathRef"); AddOutputParameter( functionTypeBuilder, DataTypes.FileHandleType.CreateOption(), "fileHandle"); OpenFileHandleType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("ReadLineFromFileHandle"); AddInputOutputParameter( functionTypeBuilder, DataTypes.FileHandleType.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife")), "fileHandleRef"); AddOutputParameter( functionTypeBuilder, PFTypes.String.CreateOption(), "line"); ReadLineFromFileHandleType = functionTypeBuilder.CreateType(); functionTypeBuilder = PFTypes.Factory.DefineFunction("WriteStringToFileHandle"); AddInputOutputParameter( functionTypeBuilder, DataTypes.FileHandleType.CreateMutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife1")), "fileHandleRef"); AddInputOutputParameter( functionTypeBuilder, DataTypes.StringSliceType.CreateImmutableReference(AddGenericLifetimeTypeParameter(functionTypeBuilder, "TLife2")), "dataRef"); WriteStringToFileHandleType = functionTypeBuilder.CreateType(); }