Skip to content

Instantly share code, notes, and snippets.

@acple
Last active March 18, 2019 10:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save acple/ca3a911157c12781202d848a6acb21a3 to your computer and use it in GitHub Desktop.
Save acple/ca3a911157c12781202d848a6acb21a3 to your computer and use it in GitHub Desktop.
メッメモリリークだあーーにげろーー
using System.Collections.Generic;
using ParsecSharp;
using ParsecSharp.Internal;
namespace ParsecSharp.Extensions
{
public static class Parser
{
public static Parser<TToken, T> Memoize<TToken, T>(Parser<TToken, T> parser)
{
var cache = new Dictionary<IParsecStateStream<TToken>, Result<TToken, T>>();
return Builder.GetState<TToken>()
.Bind(state => (cache.TryGetValue(state, out var result))
? Builder.Create<TToken, T>(_ => result)
: parser.ModifyResult(
(_, fail) => { cache[state] = fail; return fail; },
(_, success) => { cache[state] = success; return success; }));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment