Olá!
Estou escrevendo um compilador para uma DSL externa. Visando testar o “tokenizer”, criei uma aplicação playground simples, com um editor RTF, onde faço highlighting do código na medida em que ele é informado.
O problema é que não queria disparar o processo a cada pequena modificação. Faria mais sentido esperar uma “pausa” do usuário. Como implementar? Usando Reactive Extensions.
var shouldHighlight = Observable .FromEventPattern<TextChangedEventArgs>(SourceRichTextBox, "TextChanged") .Throttle(TimeSpan.FromMilliseconds(500)) .Select(e => new TextRange( SourceRichTextBox.Document.ContentStart, SourceRichTextBox.Document.ContentEnd).Text ) .DistinctUntilChanged(); shouldHighlight .ObserveOnDispatcher() .Subscribe(e => HighlightCode());
Na configuração, crio um “Observable” a partir do evento “TextChanged” do meu componente RTF. Em seguida, indico que quero um período mínimo de 500ms entre uma ocorrência e outra. Por fim, descarto ocorrências onde não houver mudança do conteúdo.
Hmmmm… acho que é isso que os frameworks js, ReactJs principalmente usam pra dar update no DOM, eles dão updates de tempos em tempos, pegando da fila de mudanças, em vez de meter o dedo no DOM a cada modificação… muito legal. Se não me engano, o AngularJs novo também funciona assim, dizem que fica muito bom!!! Abraços!!
Sensacional como o exemplo é simples, mas útil! Parabéns!
Fiquei interessado no DSL! Alguma intenção de abrir o código fonte?