using System.Collections; using System.Collections.Generic; using System.Text.RegularExpressions; namespace Rokojori { public class LexerList { protected List _events; public List events => _events; public LexerList Filter( System.Predicate le ) { return Create( events.Filter( e => le( e ) ) ); } public LexerList GetAll( LexerMatcher lexerMatcher ) { return Create( events.Filter( e => e.Is( lexerMatcher ) ) ); } public List Seperate( int start, int end, LexerMatcher[] ignore = null ) { return Seperate( ",", start, end, ignore ); } public List Seperate( string seperator, int start, int end, LexerMatcher[] ignore = null ) { var list = new List(); var currentStart = -1; for ( int i = start; i <= end; i++ ) { if ( _events[ i ].MatchIs( seperator ) ) { if ( currentStart != -1 ) { list.Add( new RangeI( currentStart, i - 1 ) ); } currentStart = -1; } else if ( ignore != null && _events[ i ].IsAnyOf( ignore ) ) { continue; } else if ( currentStart == -1 ) { currentStart = i; } } if ( currentStart != -1 ) { list.Add( new RangeI( currentStart, end ) ); } return list; } public void ForEach( LexerMatcher lexerMatcher, System.Action action ) { events.ForEach( ( e )=> { if ( ! e.Is( lexerMatcher ) ) { return; } action( e ); } ); } public LexerEvent.FindResult FindOpeningBracket( int offset, string blockBracket = "{" ) { return LexerEvent.FindOpeningBracket( _events, offset, blockBracket ); } public LexerEvent.FindResult ReverseFindOpeningBracket( int offset ) { return LexerEvent.ReverseFindOpeningBracket( _events, offset ); } public LexerEvent.FindResult ReverseFind( int offset, System.Func evaluator ) { return LexerEvent.Find( _events, offset, evaluator, false ); } public LexerEvent.FindResult Find( int offset, System.Func evaluator ) { return LexerEvent.Find( _events, offset, evaluator, true ); } public List> FindSequences( System.Func matcher ) { return LexerEvent.FindSequences( _events, matcher ); } public List GetBlocks() { return LexerEvent.GetBlocks( _events ); } public LexerList Range( RangeI range ) { return Range( range.min, range.max ); } public LexerList Range( int start, int end = -1 ) { if ( end == -1 ) { end = _events.Count; } return Create( _events.Sub( start, end - start + 1 ) ); } public static LexerList Create( List lexerEvents ) { var list = new LexerList(); list._events = lexerEvents; return list; } } }