Files
crtr/Assets/Cryville/Crtr/Ruleset/RulesetSelectors.cs

100 lines
3.0 KiB
C#

using Cryville.Common.Pdt;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Cryville.Crtr.Ruleset {
public class RulesetSelectors {
readonly RulesetSelector[] selectors;
public RulesetSelectors(IEnumerable<RulesetSelector> s) {
selectors = s.ToArray();
}
public void Optimize(PdtEvaluatorBase etor) {
for (int i = 0; i < selectors.Length; i++) {
selectors[i].Optimize(etor);
}
}
public IEnumerable<ChartEvent> Match(ChartEvent ev) {
IEnumerable<ChartEvent> result = new ChartEvent[] { ev };
foreach (var sel in selectors) {
IEnumerable<ChartEvent> temp = new ChartEvent[0];
foreach (var e in result) {
var m = sel.Match(e);
if (m != null) temp = temp.Concat(m);
}
result = temp;
}
return result;
}
public override string ToString() {
if (selectors.Length == 0) return "";
bool flag = false;
string r = "";
foreach (var s in selectors) {
if (flag) r += " " + s.ToString();
else { r += s.ToString(); flag = true; }
}
return r;
}
}
public abstract class RulesetSelector {
public virtual void Optimize(PdtEvaluatorBase etor) { }
public abstract IEnumerable<ChartEvent> Match(ChartEvent ev);
public class CreateItem : RulesetSelector {
public override string ToString() {
return "$";
}
public override IEnumerable<ChartEvent> Match(ChartEvent ev) {
if (ev is not EventList tev) throw new ArgumentException("Event is not event list");
var result = tev.Create();
tev.Events.Add(result); // TODO create at
return new ChartEvent[] { result };
}
}
public class EventType : RulesetSelector {
readonly string _type;
public EventType(string type) { _type = type; }
public override string ToString() {
return _type;
}
public override IEnumerable<ChartEvent> Match(ChartEvent ev) {
if (ev is not EventContainer tev) throw new ArgumentException("Event is not container");
return new ChartEvent[] { tev.GetEventsOfType(_type) };
}
}
public class Index : RulesetSelector {
public override string ToString() {
return "#";
}
public override IEnumerable<ChartEvent> Match(ChartEvent ev) {
if (ev is not EventList tev) throw new ArgumentException("Event is not event list");
return tev.Events; // TODO select at
}
}
public class Property : RulesetSelector {
readonly PdtExpression _exp;
readonly PdtOperator _op;
bool _flag;
public Property(PdtExpression exp) {
_exp = exp;
_op = new PropOp.Boolean(v => _flag = v);
}
public override string ToString() {
return string.Format("> {{{0}}}", _exp);
}
public override void Optimize(PdtEvaluatorBase etor) {
etor.Optimize(_exp);
}
public override IEnumerable<ChartEvent> Match(ChartEvent ev) {
PdtEvaluator.Instance.ContextEvent = ev;
if (!PdtEvaluator.Instance.Evaluate(_op, _exp))
throw new EvaluationFailureException();
PdtEvaluator.Instance.ContextEvent = null;
if (_flag) return new ChartEvent[] { ev };
else return null;
}
}
}
}