Έχουν δημοσιευτεί Σάββατο, 27 Φεβρουαρίου 2010 2:06 μμ από το μέλος PALLADIN

Reactive Monads


Το Rx είναι το νέο δημιούργημα του Erik Meijer, και μετά από μήνες ενασχόλησης μαζί του, νομίζω ότι είναι απλά 'a work of genius'.
Αυτό που κάνει είναι να δρα ως compositional glue για events, asynchronous calls  και γενικά για push based computations.

Κατεβάστε το από εδώ και αρχίστε να εξερευνείτε τις δυνατότητές του (You will be amazed).

Ως ένα παράδειγμα της μαγείας του, έγραψα ένα κλασσικό mouse move recording and playback.

	    var mouseMoveObservable = Observable.Merge(new Control[] { this, recordButton, stopButton, playButton }
                                                    		.Select(control => Observable.FromEvent<MouseEventArgs>(control, "MouseMove")));

            ReplaySubject<TimeInterval<IEvent<MouseEventArgs>>> replayObservable = null;
            Observable.FromEvent<EventArgs>(recordButton, "Click").ObserveOnWindowsForms().Subscribe(_ =>
            {
                stopButton.Enabled = true; recordButton.Enabled = false;
                replayObservable = mouseMoveObservable.TimeInterval().Record();
                replayObservable.ObserveOnWindowsForms().Subscribe(time => this.Text = String.Format("{0},{1}", time.Value.EventArgs.X, time.Value.EventArgs.Y));
            });

            Observable.FromEvent<EventArgs>(stopButton, "Click").ObserveOnWindowsForms().Subscribe(_ =>
            {
                replayObservable.Dispose();
                stopButton.Enabled = false; playButton.Enabled = true;
            });
            
            Observable.FromEvent<EventArgs>(playButton, "Click").ObserveOnWindowsForms().Subscribe(_ =>
            {
                playButton.Enabled = false;
                var playObservable = replayObservable.ToEnumerable()
                                     .Aggregate(Observable.Return(new Unit()),
                                                (accObservable, timeMouse) => accObservable.Delay(timeMouse.Interval)
                                                                                            .ObserveOnWindowsForms()                                                                                            
                                                                                            .Do(__ => Cursor.Position = ((Control)timeMouse.Value.Sender).PointToScreen(new Point(timeMouse.Value.EventArgs.X, timeMouse.Value.EventArgs.Y))));
                playObservable.Subscribe(value => { }, () => recordButton.Enabled = true);
            });


Share



Attachment(s): TestRx.zip

Ενημέρωση για Σχόλια

Αν θα θέλατε να λαμβάνετε ένα e-mail όταν γίνονται ανανεώσεις στο περιεχόμενο αυτής της δημοσίευσης, παρακαλούμε γίνετε συνδρομητής εδώ

Παραμείνετε ενήμεροι στα τελευταία σχόλια με την χρήση του αγαπημένου σας RSS Aggregator και συνδρομή στη Τροφοδοσία RSS με σχόλια

Σχόλια:

 

fusion έγραψε:

Τελείως τυχαία έπεσα σε αυτή την παρουσίαση

http://live.visitmix.com/MIX10/Sessions/FTL01

Μαρτίου 23, 2010 11:29 μμ

Ποιά είναι η άποψή σας για την παραπάνω δημοσίευση;

(απαιτούμενο) 
απαιτούμενο 
προαιρετικό
απαιτούμενο 
ÅéóÜãåôå ôïí êùäéêü:
CAPTCHA Image