// Gets the identifier for a portable function. public int GetIdentifier(ActionSet actionSet, IWorkshopPortableFunctionIdentifier portableFunction) { var compatible = GetCompatibleLambda(actionSet.ThisTypeLinker, portableFunction); if (compatible != null) { return(compatible.Identifier); } return(CreateCompatibleLambda(actionSet.ThisTypeLinker, portableFunction).Identifier); }
// Gets a CompatibleLambda that supports the provided type linker and portable function. CompatibleLambda GetCompatibleLambda(InstanceAnonymousTypeLinker typeLinker, IWorkshopPortableFunctionIdentifier portableFunction) { // Iterate through each compatible lambda. foreach (var compatibleLambda in _compatibleLambdas) { // Make sure the keys match and the type linker is compatible.. if (compatibleLambda.Runner.Key == portableFunction.Key && compatibleLambda.TypeLinker.Compatible(typeLinker)) { // This lambda is compatible with the provided lambda. return(compatibleLambda); } } // No compatible lambdas were found. return(null); }
CompatibleLambda CreateCompatibleLambda(InstanceAnonymousTypeLinker typeLinker, IWorkshopPortableFunctionIdentifier portableFunction) { var compatibleLambda = new CompatibleLambda(_assignCurrentIdentifier++, portableFunction.CreateRunner(_parameterRecycler), typeLinker); _parameterRecycler.Reset(); _compatibleLambdas.Add(compatibleLambda); return(compatibleLambda); }