module dlex.Rule.PredicateRule;

import dlex.Rule;

import std.conv;

class PredicateRule : Rule {
    public:
	alias PredT = bool function(dchar);
	PredT pred;
	this (PredT pred) {
	    this.pred = pred;
	}
	override MatchResult match(dstring source, ref Position pos) {
	    auto prevPos = pos;
	    if (pos.end(source)) {
		return null;
	    }
	    auto next = pos.next(source);
	    if (pred(next)) {
		return new MatchResult(next.to!dstring, prevPos);
	    }
	    pos = prevPos;
	    return null;
	}
}