PatternBuilder.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. 
  2. namespace Yuuna.Contracts.Patterns
  3. {
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.Collections.Immutable;
  9. using System.Diagnostics;
  10. using System.Diagnostics.CodeAnalysis;
  11. using System.Linq;
  12. using System.Text;
  13. using Yuuna.Contracts.Interaction;
  14. using Yuuna.Contracts.Optimization;
  15. using Yuuna.Contracts.Semantics;
  16. internal sealed class PatternBuilder : IGrammarSet, IPatternBuilder
  17. {
  18. private readonly ImmutableDictionary<IGrammar, Behaviour>.Builder _rules;
  19. internal PatternBuilder()
  20. {
  21. this._rules = ImmutableDictionary.CreateBuilder<IGrammar, Behaviour>(EqualityComparer<IGrammar>.Default);
  22. }
  23. public IImmutableList<IGrammar> ToImmutable()
  24. {
  25. return this._rules.Keys.ToImmutableArray();
  26. }
  27. public bool TryGet(IGrammar grammar, out Behaviour behaviour)
  28. {
  29. return this._rules.TryGetValue(grammar, out behaviour);
  30. }
  31. IBehaviourBuilder IPatternBuilder.Build(IGroup group, params IGroup[] rest)
  32. {
  33. if (group is null)
  34. throw new ArgumentNullException(nameof(group));
  35. var g = new Grammar();
  36. g.Add(group);
  37. if (rest != null)
  38. foreach (var item in rest)
  39. {
  40. g.Add(item);
  41. }
  42. g.Immute();
  43. return new BehaviourBuilder(this._rules.Add, g);
  44. }
  45. }
  46. }