Exemple #1
0
        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());
        }
Exemple #2
0
        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();
        }