public static void AddCheckpointPattern(string triggeringFuncName, string yieldingFuncName)
 {
     PatternToActionGenerator[triggeringFuncName] = new ActionGenerators
     {
         forceCheckpoint = _ => $"{yieldingFuncName}()"
     };
 }
        public static void AddCheckpointNextPattern(string triggeringFuncName, string yieldingFuncName)
        {
            string pattern = $@"(^|[\s\(:]){triggeringFuncName}(\(|\s*,)";

            PatternToActionGenerator[pattern] = new ActionGenerators
            {
                unpreload = _ => $"{yieldingFuncName}()\n"
            };
        }
        // Generate `preload(obj, 'resource')` when matching `func(...)` or `...(func, ...)`
        public static void AddPatternWithObjectAndResource(string funcName, string objName, string resource)
        {
            string pattern = $@"(^|[ \(:]){funcName}(\(| *,)";

            PatternToActionGenerator[pattern] = new ActionGenerators
            {
                preload   = groups => $"preload({objName}, '{resource}')",
                unpreload = groups => $"unpreload({objName}, '{resource}')"
            };
        }
        // Generate `preload(obj, 'resource')` when matching `func('resource', ...)` or `...(func, 'resource', ...)`
        public static void AddPatternWithObject(string funcName, string objName)
        {
            string pattern = $@"(^|[ \(:]){funcName}(\(| *,) *'(?<res>[^']+)'";

            PatternToActionGenerator[pattern] = new ActionGenerators
            {
                preload   = groups => $"preload({objName}, '{groups["res"].Value}')",
                unpreload = groups => $"unpreload({objName}, '{groups["res"].Value}')"
            };
        }
        // Generate `preload(obj, 'resource')` when matching `func('resource', ...)` or `...(func, 'resource', ...)`
        public static void AddPatternWithObject(string funcName, string objName)
        {
            string pattern = $@"(^|[\s\(:]){funcName}(\(|\s*,)\s*(?<res>['""][^'""]+['""])";

            PatternToActionGenerator[pattern] = new ActionGenerators
            {
                preload   = groups => $"preload({objName}, {groups["res"].Value})\n",
                unpreload = groups => $"unpreload({objName}, {groups["res"].Value})\n"
            };
        }
        // Generate `preload(obj, 'resource_1')\npreload(obj, 'resource_2')\n...`
        // when matching `func({'resource_1', 'resource_2', ...}, ...)` or `...(func, {'resource_1', 'resource_2', ...}, ...)`
        public static void AddPatternWithObjectForTable(string funcName, string objName)
        {
            string pattern = $@"(^|[ \(:]){funcName}(\(| *,) *\{{(?<res>[^\}}]+)\}}";

            PatternToActionGenerator[pattern] = new ActionGenerators
            {
                preload = groups => string.Join("\n",
                                                groups["res"].Value.Split(',').Select(res => $"preload({objName}, {res})")
                                                ),
                unpreload = groups => string.Join("\n",
                                                  groups["res"].Value.Split(',').Select(res => $"unpreload({objName}, {res})")
                                                  )
            };
        }
        // Generate `preload(obj, 'resource_1')\npreload(obj, 'resource_2')\n...`
        // when matching `func(obj, {'resource_1', 'resource_2', ...}, ...)` or `...(func, obj, {'resource_1', 'resource_2', ...}, ...)`
        public static void AddPatternForTable(string funcName)
        {
            string pattern = $@"(^|[\s\(:]){funcName}(\(|\s*,)\s*(?<obj>[^\s,]+)\s*,\s*\{{(?<res>[^\}}]+)\}}";

            PatternToActionGenerator[pattern] = new ActionGenerators
            {
                preload = groups => string.Concat(
                    groups["res"].Value.Split(',').Select(res => $"preload({groups["obj"].Value}, {res})\n")
                    ),
                unpreload = groups => string.Concat(
                    groups["res"].Value.Split(',').Select(res => $"unpreload({groups["obj"].Value}, {res})\n")
                    )
            };
        }