programação reativa e o actor model

142
Programação Reativa e o Actor Model Elemar Júnior @elemarjr [email protected] [email protected] elemarjr.com

Upload: fabricio-rissetto

Post on 09-Feb-2017

57 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Programação reativa e o actor model

Programação Reativa e o Actor Model

Elemar Júnior@elemarjr

[email protected]@gmail.com

elemarjr.com

Page 2: Programação reativa e o actor model

Olá, eu sou Elemar Jr

Page 3: Programação reativa e o actor model

Abstrações...

Page 4: Programação reativa e o actor model

Antes de entender o que é Programação Reativa, vamos

entender o que não é!

Page 5: Programação reativa e o actor model

public static string[] GetNamesFromEmployees(Employee[] employees){ var result = new string[employees.Length]; for (var i = 0; i < employees.Length; i++) { result[i] = employees[i].Name; } return result;}

Page 6: Programação reativa e o actor model

public static string[] GetNamesFromEmployees(Employee[] employees){ var result = new string[employees.Length]; for (var i = 0; i < employees.Length; i++) { result[i] = employees[i].Name; } return result;}

Page 7: Programação reativa e o actor model

public static List<string> GetNamesFromEmployees(List<Employee> employees){ var result = new List<string>(employees.Count); foreach (var employee in employees) { result.Add(employee.Name); } return result;}

Page 8: Programação reativa e o actor model

public static IList<string> GetNamesFromEmployees(IList<Employee> employees){ var result = new List<string>(employees.Count); foreach (var employee in employees) { result.Add(employee.Name); } return result;}

Page 9: Programação reativa e o actor model

public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees){ var result = new List<string>(); foreach (var employee in employees) { result.Add(employee.Name); } return result;}

Page 10: Programação reativa e o actor model

public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees){ var result = new List<string>(); foreach (var employee in employees) { result.Add(employee.Name); } return result;}

Page 11: Programação reativa e o actor model

public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees){ foreach (var employee in employees) { yield return employee.Name; }}

Page 12: Programação reativa e o actor model

PAUSA PARA ENTENDER...

Page 13: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Page 14: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4

Page 15: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4

Page 16: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4

Page 17: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4

Page 18: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4

Page 19: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4

Page 20: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4

Page 21: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4

Page 22: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 1

Page 23: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 1

Page 24: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 1

Page 25: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 1

Page 26: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 11

Page 27: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 11

Page 28: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 11

Page 29: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 11After Yield 1

Page 30: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 11After Yield 1Before Yield 2

Page 31: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

Before calling Get4After calling Get4Before Yield 11After Yield 1Before Yield 2

...

Page 32: Programação reativa e o actor model

VOLTAMOS...

Page 33: Programação reativa e o actor model

public static IEnumerable<string> GetNamesFromEmployees(IEnumerable<Employee> employees){ foreach (var employee in employees) { yield return employee.Name; }}

Page 34: Programação reativa e o actor model

public static class EnumerableOfEmployees{ public static IEnumerable<string> GetNames(IEnumerable<Employee> employees) { foreach (var employee in employees) { yield return employee.Name; } }}

EnumerableOfEmployees.GetNames(someListOfEmployees);

Page 35: Programação reativa e o actor model

public static class EnumerableOfEmployees{ public static IEnumerable<string> GetNames( this IEnumerable<Employee> employees ) { foreach (var employee in employees) { yield return employee.Name; } }}

var names = someListOfEmployees.GetNames();

var names = EnumerableOfEmployees.GetNames(someListOfEmployees);

Page 36: Programação reativa e o actor model

public static class EnumerableOfEmployees{ public static IEnumerable<string> GetNames( this IEnumerable<Employee> employees ) { foreach (var employee in employees) { yield return employee.Name; } }

public static IEnumerable<string> GetSocialSecurityNumbers( this IEnumerable<Employee> employees ) { foreach (var employee in employees) { yield return employee.SocialSecurityNumber; } }}

Page 37: Programação reativa e o actor model

public static class EnumerableOfEmployees{ public static IEnumerable<string> GetNames( this IEnumerable<Employee> employees ) { foreach (var employee in employees) { yield return employee.Name; } }

public static IEnumerable<string> GetSocialSecurityNumbers( this IEnumerable<Employee> employees ) { foreach (var employee in employees) { yield return employee.SocialSecurityNumber; } }}

Page 38: Programação reativa e o actor model

public static class EnumerableOfEmployees{ public static IEnumerable<TResult> Get<TResult>( this IEnumerable<Employee> employees, Func<Employee, TResult> selector ) { foreach (var employee in employees) { yield return selector(employee); } }}

var names = someListOfEmployees.Get(e => e.Name);var ssn = someListOfEmployees.Get(e => e.SocialSecurityNumber);

Page 39: Programação reativa e o actor model

public static class EnumerableOfEmployees{ public static IEnumerable<TResult> Get<TResult>( this IEnumerable<Employee> employees, Func<Employee, TResult> selector ) { foreach (var employee in employees) { yield return selector(employee); } }}

Page 40: Programação reativa e o actor model

public static class Enumerable{ public static IEnumerable<TResult> Get<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) { foreach (var element in elements) { yield return selector(element); } }}

Page 41: Programação reativa e o actor model

public static class Enumerable{ public static IEnumerable<TResult> Get<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) { foreach (var element in elements) { yield return selector(element); } }}

Page 42: Programação reativa e o actor model

public static class Enumerable{ public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) { foreach (var element in elements) { yield return selector(element); } }}

Page 43: Programação reativa e o actor model

LINQPara objetos em memória

Page 44: Programação reativa e o actor model

public static class Enumerable{ public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) { foreach (var element in elements) { yield return selector(element); } }}

var names = someListOfEmployees.Select(e => e.Name);var ssn = someListOfEmployees.Select(e => e.SocialSecurityNumber);

Page 45: Programação reativa e o actor model

public static IEnumerable<T> Where<T>( this IEnumerable<T> elements, Func<T, bool> filter){ foreach (var element in elements) { if (filter(element)) { yield return element; } }}

Page 46: Programação reativa e o actor model

public static IEnumerable<T> Take<T>( this IEnumerable<T> elements, int count){ var i = 0; foreach (var element in elements) { if (i >= count) yield break; yield return element; i++; }}

Page 47: Programação reativa e o actor model

public static class Enumerable{ public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) { foreach (var element in elements) { yield return selector(element); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}

Page 48: Programação reativa e o actor model

public static class Enumerable{ public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) { foreach (var element in elements) { yield return selector(element); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{ T Current { get; }}

Page 49: Programação reativa e o actor model

public static class Enumerable{ public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) { foreach (var element in elements) { yield return selector(element); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{ T Current { get; }}public interface IEnumerator{ object Current { get; } bool MoveNext(); void Reset();}

Page 50: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ){ using (var enumerator = elements.GetEnumerator()) { while (enumerator.MoveNext()) { yield return selector(enumerator.Current); } }}

Page 51: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ){ using (var enumerator = elements.GetEnumerator()) { while (enumerator.MoveNext()) { yield return selector(enumerator.Current); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{ T Current { get; }}public interface IEnumerator{ object Current { get; } bool MoveNext(); void Reset();}

Page 52: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ){ using (var enumerator = elements.GetEnumerator()) { while (enumerator.MoveNext()) { yield return selector(enumerator.Current); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{ T Current { get; }}public interface IEnumerator{ object Current { get; } bool MoveNext(); void Reset();}

Page 53: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ){ using (var enumerator = elements.GetEnumerator()) { while (enumerator.MoveNext()) { yield return selector(enumerator.Current); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{ T Current { get; }}public interface IEnumerator{ object Current { get; } bool MoveNext(); void Reset();}

Page 54: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ){ using (var enumerator = elements.GetEnumerator()) { while (enumerator.MoveNext()) { yield return selector(enumerator.Current); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{ T Current { get; }}public interface IEnumerator{ object Current { get; } bool MoveNext(); void Reset();}

Page 55: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ){ using (var enumerator = elements.GetEnumerator()) { while (enumerator.MoveNext()) { yield return selector(enumerator.Current); } }}

public interface IEnumerable<out T> : IEnumerable{ IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{ T Current { get; }}public interface IEnumerator{ object Current { get; } bool MoveNext(); void Reset();}

Page 56: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ){ using (var enumerator = elements.GetEnumerator()) { while (enumerator.MoveNext()) { yield return selector(enumerator.Current); } }}

Page 57: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) => new SelectEnumerable<T, TResult>(elements, selector);

class SelectEnumerable<T, TResult> : IEnumerable<TResult>{ private readonly IEnumerable<T> _elements; private readonly Func<T, TResult> _selector;

public SelectEnumerable( IEnumerable<T> elements, Func<T, TResult> selector ) { _elements = elements; _selector = selector; }

public IEnumerator<TResult> GetEnumerator() => new SelectEnumerator(_elements.GetEnumerator(), _selector);

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();}

Page 58: Programação reativa e o actor model

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) => new SelectEnumerable<T, TResult>(elements, selector);

class SelectEnumerable<T, TResult> : IEnumerable<TResult>{ private readonly IEnumerable<T> _elements; private readonly Func<T, TResult> _selector;

public SelectEnumerable( IEnumerable<T> elements, Func<T, TResult> selector ) { _elements = elements; _selector = selector; }

public IEnumerator<TResult> GetEnumerator() => new SelectEnumerator(_elements.GetEnumerator, _selector);

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 59: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);foreach (var name in names){ Console.WriteLine(name);}

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

Page 60: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

Page 61: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

public static IEnumerable<TResult> Select<T, TResult>( this IEnumerable<T> elements, Func<T, TResult> selector ) => new SelectEnumerable<T, TResult>(elements, selector);

Page 62: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

Page 63: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

class SelectEnumerable<T, TResult> : IEnumerable<TResult>{ private readonly IEnumerable<T> _elements; private readonly Func<T, TResult> _selector;

public SelectEnumerable( IEnumerable<T> elements, Func<T, TResult> selector ) { _elements = elements; _selector = selector; }

public IEnumerator<TResult> GetEnumerator() => new SelectEnumerator(_elements.GetEnumerator, _selector);

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();}

Page 64: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 65: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 66: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 67: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 68: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 69: Programação reativa e o actor model

var names = someEmployees.Select(e => e.Name);using (var enumerator = names.GetEnumerator()){ while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 70: Programação reativa e o actor model

class WhereEnumerator<T> : IEnumerator<T>{ private readonly IEnumerator<T> _source; private readonly Func<T, bool> _filter;

public WhereEnumerator( IEnumerator<T> source, Func<T, bool> filter ) { _source = source; _filter = filter; }

public void Dispose() => _source.Dispose();

public bool MoveNext() { while (_source.MoveNext()) if (_filter(_source.Current)) return true;

return false; }

public void Reset() => _source.Reset(); public T Current => _source.Current; object IEnumerator.Current => Current;}

Page 71: Programação reativa e o actor model

class WhereEnumerator<T> : IEnumerator<T>{ private readonly IEnumerator<T> _source; private readonly Func<T, bool> _filter;

public WhereEnumerator( IEnumerator<T> source, Func<T, bool> filter ) { _source = source; _filter = filter; }

public void Dispose() => _source.Dispose();

public bool MoveNext() { while (_source.MoveNext()) if (_filter(_source.Current)) return true;

return false; }

public void Reset() => _source.Reset(); public T Current => _source.Current; object IEnumerator.Current => Current;}

class SelectEnumerator<T, TResult> : IEnumerator<TResult>{ private readonly IEnumerator<T> _source; private readonly Func<T, TResult> _selector;

public SelectEnumerator( IEnumerator<T> source, Func<T, TResult> selector ) { _source = source; _selector = selector; }

public void Dispose() => _source.Dispose(); public bool MoveNext() => _source.MoveNext(); public void Reset() => _source.Dispose(); public TResult Current => _selector(_source.Current); object IEnumerator.Current => Current;}

Page 72: Programação reativa e o actor model

PAUSA PARA ENTENDER...

Page 73: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

public static IEnumerable<int> Get4() => new Get4Enumerable();

Page 74: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

using (var enumerator = elements.GetEnumerator()){ while (enumerator.MoveNext()) { WriteLine(enumerator.Current); }}

Page 75: Programação reativa e o actor model

using System.Collections.Generic;using static System.Console;

public class Program{ public static void Main() { WriteLine("Before calling Get4"); var elements = Get4(); WriteLine("After calling Get4"); foreach (var e in elements) { WriteLine(e); } }

public static IEnumerable<int> Get4() { for (var i = 1; i <= 4; i++) { WriteLine($"Before Yield {i}"); yield return i; WriteLine($"After Yield {i}"); } }}

class Get4Enumerator : IEnumerator<int>{ private int _state; private int _current; public void Dispose() { } bool IEnumerator.MoveNext() { if (_state == 1) WriteLine($"After Yield {_current}"); if (_current >= 4) { _state = 2; return false; }

_current++; WriteLine($"Before Yield {_current}"); _state = 1; return true; }

public void Reset() { _current = 0; } public int Current => _current; object IEnumerator.Current => Current;}

Page 76: Programação reativa e o actor model

VOLTAMOS...

Page 77: Programação reativa e o actor model

Where Select ConsumerProducer

Page 78: Programação reativa e o actor model

Where Select ConsumerProducer

GetEnumerator()

using (var enumerator = elements.GetEnumerator()){ while (enumerator.MoveNext()) { WriteLine(enumerator.Current); }}

Page 79: Programação reativa e o actor model

Where Select ConsumerProducer

GetEnumerator()GetEnumerator()

using (var enumerator = elements.GetEnumerator()){ while (enumerator.MoveNext()) { WriteLine(enumerator.Current); }}

Page 80: Programação reativa e o actor model

Where Select ConsumerProducer

GetEnumerator()GetEnumerator()GetEnumerator()

using (var enumerator = elements.GetEnumerator()){ while (enumerator.MoveNext()) { WriteLine(enumerator.Current); }}

Page 81: Programação reativa e o actor model

Where Select ConsumerProducer

MoveNext()

using (var enumerator = elements.GetEnumerator()){ while (enumerator.MoveNext()) { WriteLine(enumerator.Current); }}

Page 82: Programação reativa e o actor model

Where Select ConsumerProducer

MoveNext()MoveNext()

using (var enumerator = elements.GetEnumerator()){ while (enumerator.MoveNext()) { WriteLine(enumerator.Current); }}

Page 83: Programação reativa e o actor model

Where Select ConsumerProducer

MoveNext()MoveNext()MoveNext()

using (var enumerator = elements.GetEnumerator()){ while (enumerator.MoveNext()) { WriteLine(enumerator.Current); }}

Consumidor Comanda

Page 84: Programação reativa e o actor model

Estamos habituados a desenvolver código “pró-ativo”

Page 85: Programação reativa e o actor model

Mas por que se fala tanto em programação “reativa”?

Page 86: Programação reativa e o actor model

Usuários esperam resultados em real-time

Page 87: Programação reativa e o actor model

Eventos são cidadãos de primeira grandeza.

Page 88: Programação reativa e o actor model

Eventos são cidadãos de primeira grandezaUser Interface

Page 89: Programação reativa e o actor model

Eventos são cidadãos de primeira grandezaDomain Events

Page 90: Programação reativa e o actor model

Eventos são cidadãos de primeira grandeza

Infrastructure Events

Page 91: Programação reativa e o actor model

Eventos são cidadãos de primeira grandeza

Integration Events (Bus)

Page 92: Programação reativa e o actor model

Erik Meijer

Page 93: Programação reativa e o actor model

Where Select ConsumerProducer

IEnumerableIEnumerableIEnumerable

Page 94: Programação reativa e o actor model

Where Select ConsumerProducer

IEnumerableIEnumerableIEnumerableIObservableIObservableIObservable

Page 95: Programação reativa e o actor model

Where Select ConsumerProducer

IEnumerableIEnumerableIEnumerableIObservableIObservableIObservable

public interface IObservable<out T>{ IDisposable Subscribe(IObserver<T> observer);}

Page 96: Programação reativa e o actor model

Where Select ConsumerProducer

IEnumerableIEnumerableIEnumerableIObservableIObservableIObservable

public interface IObservable<out T>{ IDisposable Subscribe(IObserver<T> observer);}

IObserver

IObserverIObserver

public interface IObserver<in T>{ void OnCompleted(); void OnError(Exception error); void OnNext(T value);}

Page 97: Programação reativa e o actor model

Where Select ConsumerProducer

Subscribe()

Page 98: Programação reativa e o actor model

Where Select ConsumerProducer

Subscribe()Subscribe()

Page 99: Programação reativa e o actor model

Where Select ConsumerProducer

Subscribe()Subscribe()Subscribe()

Page 100: Programação reativa e o actor model

Where Select ConsumerProducer

OnNext/OnError/OnCompleted OnNext/OnError/OnCompleted OnNext/OnError/OnCompleted

Page 101: Programação reativa e o actor model

Where Select ConsumerProducer

OnNext/OnError/OnCompleted OnNext/OnError/OnCompleted OnNext/OnError/OnCompleted

Produtor Comanda

Page 102: Programação reativa e o actor model

Exemplo 1: Abstrações para APIs primitivas

Page 103: Programação reativa e o actor model

public class Bytes : IObservable<byte>{ private readonly NetworkStream _stream; private readonly Subject<byte> _subject;

private Bytes(NetworkStream stream) { _stream = stream; _subject = new Subject<byte>(); }

private bool _running; private async void Run() { _running = true; var buffer = new byte[8192]; try { int bytesRead; while ((bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length)) != 0) for (var i = 0; i < bytesRead; i++) _subject.OnNext(buffer[i]);

} catch (Exception e) { _subject.OnError(e); } _subject.OnCompleted(); }

private readonly object _guard = new object(); public IDisposable Subscribe(IObserver<byte> observer) { lock (_guard) { var result = _subject.Subscribe(observer); if (!_running) Run(); return result; } }

public static Bytes From(NetworkStream stream) => new Bytes(stream);}

public class Bytes : IObservable<byte>{ private readonly NetworkStream _stream; private readonly Subject<byte> _subject;

private Bytes(NetworkStream stream) { _stream = stream; _subject = new Subject<byte>(); }

Page 104: Programação reativa e o actor model

public class Bytes : IObservable<byte>{ private readonly NetworkStream _stream; private readonly Subject<byte> _subject;

private Bytes(NetworkStream stream) { _stream = stream; _subject = new Subject<byte>(); }

private bool _running; private async void Run() { _running = true; var buffer = new byte[8192]; try { int bytesRead; while ((bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length)) != 0) for (var i = 0; i < bytesRead; i++) _subject.OnNext(buffer[i]);

} catch (Exception e) { _subject.OnError(e); } _subject.OnCompleted(); }

private readonly object _guard = new object(); public IDisposable Subscribe(IObserver<byte> observer) { lock (_guard) { var result = _subject.Subscribe(observer); if (!_running) Run(); return result; } }

public static Bytes From(NetworkStream stream) => new Bytes(stream);}

private readonly object _guard = new object();public IDisposable Subscribe(IObserver<byte> observer){ lock (_guard) { var result = _subject.Subscribe(observer); if (!_running) Run(); return result; }}

public static Bytes From(NetworkStream stream) => new Bytes(stream);

Page 105: Programação reativa e o actor model

public class Bytes : IObservable<byte>{ private readonly NetworkStream _stream; private readonly Subject<byte> _subject;

private Bytes(NetworkStream stream) { _stream = stream; _subject = new Subject<byte>(); }

private bool _running; private async void Run() { _running = true; var buffer = new byte[8192]; try { int bytesRead; while ((bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length)) != 0) for (var i = 0; i < bytesRead; i++) _subject.OnNext(buffer[i]);

} catch (Exception e) { _subject.OnError(e); } _subject.OnCompleted(); }

private readonly object _guard = new object(); public IDisposable Subscribe(IObserver<byte> observer) { lock (_guard) { var result = _subject.Subscribe(observer); if (!_running) Run(); return result; } }

public static Bytes From(NetworkStream stream) => new Bytes(stream);}

private bool _running;private async void Run(){ _running = true; var buffer = new byte[8192]; try { int bytesRead; while ((bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length)) != 0) { for (var i = 0; i < bytesRead; i++) _subject.OnNext(buffer[i]); } } catch (Exception e) { _subject.OnError(e); }

_subject.OnCompleted();}

Page 106: Programação reativa e o actor model

public class FramedMessages : IObservable<string>{ enum States {Expecting254, Expecting255 };

private readonly Subject<string> _subject; private FramedMessages(IObservable<byte> bytes) { _subject = new Subject<string>(); var buffer = new MemoryStream(); var currentState = States.Expecting254;

bytes.Subscribe(new AnonymousObserver<byte>( onNext: b => { if (currentState == States.Expecting254) { if (b == 254) currentState = States.Expecting255; else buffer.WriteByte(b); } else { if (b == 255) { currentState = States.Expecting254; var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); buffer = new MemoryStream(); } else { buffer.WriteByte(254); buffer.WriteByte(255); } } }, onCompleted: () => { var a = buffer.ToArray(); if (a.Length != 0) { var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); } _subject.OnCompleted(); } )); }

public IDisposable Subscribe(IObserver<string> observer) => _subject.Subscribe(observer);

public static FramedMessages From(IObservable<byte> bytes) => new FramedMessages(bytes);}

public class FramedMessages : IObservable<string>{ enum States { Expecting254, Expecting255 };

private readonly Subject<string> _subject; private FramedMessages(IObservable<byte> bytes) { _subject = new Subject<string>(); var buffer = new MemoryStream(); var currentState = States.Expecting254;

Page 107: Programação reativa e o actor model

public class FramedMessages : IObservable<string>{ enum States {Expecting254, Expecting255 };

private readonly Subject<string> _subject; private FramedMessages(IObservable<byte> bytes) { _subject = new Subject<string>(); var buffer = new MemoryStream(); var currentState = States.Expecting254;

bytes.Subscribe(new AnonymousObserver<byte>( onNext: b => { if (currentState == States.Expecting254) { if (b == 254) currentState = States.Expecting255; else buffer.WriteByte(b); } else { if (b == 255) { currentState = States.Expecting254; var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); buffer = new MemoryStream(); } else { buffer.WriteByte(254); buffer.WriteByte(255); } } }, onCompleted: () => { var a = buffer.ToArray(); if (a.Length != 0) { var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); } _subject.OnCompleted(); } )); }

public IDisposable Subscribe(IObserver<string> observer) => _subject.Subscribe(observer);

public static FramedMessages From(IObservable<byte> bytes) => new FramedMessages(bytes);}

bytes.Subscribe(new AnonymousObserver<byte>( onNext: b => { if (currentState == States.Expecting254) { if (b == 254) currentState = States.Expecting255; else buffer.WriteByte(b); } else { if (b == 255) { currentState = States.Expecting254; var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); buffer = new MemoryStream(); } else { buffer.WriteByte(254); buffer.WriteByte(255); } } },

Page 108: Programação reativa e o actor model

public class FramedMessages : IObservable<string>{ enum States {Expecting254, Expecting255 };

private readonly Subject<string> _subject; private FramedMessages(IObservable<byte> bytes) { _subject = new Subject<string>(); var buffer = new MemoryStream(); var currentState = States.Expecting254;

bytes.Subscribe(new AnonymousObserver<byte>( onNext: b => { if (currentState == States.Expecting254) { if (b == 254) currentState = States.Expecting255; else buffer.WriteByte(b); } else { if (b == 255) { currentState = States.Expecting254; var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); buffer = new MemoryStream(); } else { buffer.WriteByte(254); buffer.WriteByte(255); } } }, onCompleted: () => { var a = buffer.ToArray(); if (a.Length != 0) { var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); } _subject.OnCompleted(); } )); }

public IDisposable Subscribe(IObserver<string> observer) => _subject.Subscribe(observer);

public static FramedMessages From(IObservable<byte> bytes) => new FramedMessages(bytes);}

onCompleted: () =>{ var a = buffer.ToArray(); if (a.Length != 0) { var message = Encoding.UTF8.GetString(buffer.ToArray()); _subject.OnNext(message); } _subject.OnCompleted();}

Page 109: Programação reativa e o actor model

Exemplo 2: Tratamento inteligente de eventos de UI (JavaScript)

Page 110: Programação reativa e o actor model
Page 111: Programação reativa e o actor model
Page 112: Programação reativa e o actor model
Page 113: Programação reativa e o actor model
Page 114: Programação reativa e o actor model

Exemplo 3: Gerenciando fluxo de dados de API externa

Page 115: Programação reativa e o actor model

var framesGrabbed = Observable.FromEventPattern( h => _capturer.ImageGrabbed += h, h => _capturer.ImageGrabbed -= h ) .Sample(TimeSpan.FromSeconds(1));

Page 116: Programação reativa e o actor model

// frame to bitmapvar bitmaps = framesGrabbed.Select( args => ((Capture)args.Sender).QueryFrame().Bitmap );

Page 117: Programação reativa e o actor model

Exemplo 4: Combinando eventos I

Page 118: Programação reativa e o actor model

var form = this;

var mouseDown = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>( h => form.MouseDown += h, h => form.MouseDown -= h);

var mouseUp = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>( h => form.MouseUp += h, h => form.MouseUp -= h);

var mouseMove = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>( h => form.MouseMove += h, h => form.MouseMove -= h);

Page 119: Programação reativa e o actor model

var dragging = from down in mouseDown from move in mouseMove.TakeUntil(mouseUp) select new { Start = down.EventArgs.Location, Finish = move.EventArgs.Location };

Page 120: Programação reativa e o actor model

var subscription = dragging.Subscribe(info =>{ using (Graphics g = form.CreateGraphics()) g.DrawLine(Pens.Red, info.Start, info.Finish);});

Page 121: Programação reativa e o actor model

Exemplo 5: Reconhecendo sequências

Page 122: Programação reativa e o actor model

var keyUp = Observable.FromEventPattern<KeyEventHandler, KeyEventArgs>( h => form.KeyUp += h, h => form.KeyUp -= h).Select(key => key.EventArgs.KeyCode);

Page 123: Programação reativa e o actor model

Func<Keys, IObservable<Keys>> WherePressedIs = (searchedKey) => keyUp.Where(k => k == searchedKey);

Func<Keys, IObservable<Keys>> WherePressedIsNot = (searchedKey) => keyUp.Where(k => k != searchedKey);

Page 124: Programação reativa e o actor model

var abcPressed = from fst in WherePressedIs(Keys.A) from snd in WherePressedIs(Keys.B).Take(1).TakeUntil(WherePressedIsNot(Keys.B)) from thd in WherePressedIs(Keys.C).Take(1).TakeUntil(WherePressedIsNot(Keys.C)) select new Unit();

Page 125: Programação reativa e o actor model

Adotando Actor Model

Page 126: Programação reativa e o actor model

Ele foi definido em 1973 por Carl Hewitt

Page 127: Programação reativa e o actor model

Define uma abstração para Sistemas Distribuídos e Concorrentes

Page 128: Programação reativa e o actor model

Foi popularizado na linguagem ERLANG

Page 129: Programação reativa e o actor model
Page 130: Programação reativa e o actor model
Page 131: Programação reativa e o actor model
Page 132: Programação reativa e o actor model
Page 133: Programação reativa e o actor model
Page 134: Programação reativa e o actor model
Page 135: Programação reativa e o actor model
Page 136: Programação reativa e o actor model
Page 137: Programação reativa e o actor model

class CapturerActor : ReceiveActor{ private readonly IActorRef _recognizer;

public CapturerActor(IActorRef recognizer) { _recognizer = recognizer; Waiting(); }

private void Waiting() { Receive<Messages.StartCapturingMessage>(m => { Execute(); Become(Running); }); }

private void Running() { Receive<Messages.StopCapturingMessage>(m => { _handler.Dispose(); _capturer.Dispose(); Become(Stopped); }); }

private void Stopped() { }

private Capture _capturer; private IDisposable _handler;

public void Execute() { _capturer = new Capture(); WriteLine();

// get a frame per second var framesGrabbed = Observable.FromEventPattern( h => _capturer.ImageGrabbed += h, h => _capturer.ImageGrabbed -= h ) .Sample(TimeSpan.FromSeconds(1));

// frame to bitmap var bitmaps = framesGrabbed.Select( args => ((Capture)args.Sender).QueryFrame().Bitmap );

_handler = bitmaps.Subscribe(bitmap => _recognizer.Tell(bitmap));

_capturer.Start(); }}

class CapturerActor : ReceiveActor{ private readonly IActorRef _recognizer;

public CapturerActor(IActorRef recognizer) { _recognizer = recognizer; Waiting(); }

private void Waiting() { Receive<Messages.StartCapturingMessage>(m => { Execute(); Become(Running); }); }

Page 138: Programação reativa e o actor model

class CapturerActor : ReceiveActor{ private readonly IActorRef _recognizer;

public CapturerActor(IActorRef recognizer) { _recognizer = recognizer; Waiting(); }

private void Waiting() { Receive<Messages.StartCapturingMessage>(m => { Execute(); Become(Running); }); }

private void Running() { Receive<Messages.StopCapturingMessage>(m => { _handler.Dispose(); _capturer.Dispose(); Become(Stopped); }); }

private void Stopped() { }

private Capture _capturer; private IDisposable _handler;

public void Execute() { _capturer = new Capture(); WriteLine();

// get a frame per second var framesGrabbed = Observable.FromEventPattern( h => _capturer.ImageGrabbed += h, h => _capturer.ImageGrabbed -= h ) .Sample(TimeSpan.FromSeconds(1));

// frame to bitmap var bitmaps = framesGrabbed.Select( args => ((Capture)args.Sender).QueryFrame().Bitmap );

_handler = bitmaps.Subscribe(bitmap => _recognizer.Tell(bitmap));

_capturer.Start(); }}

private void Running(){ Receive<Messages.StopCapturingMessage>(m => { _handler.Dispose(); _capturer.Dispose(); Become(Stopped); });}

Page 139: Programação reativa e o actor model

class CapturerActor : ReceiveActor{ private readonly IActorRef _recognizer;

public CapturerActor(IActorRef recognizer) { _recognizer = recognizer; Waiting(); }

private void Waiting() { Receive<Messages.StartCapturingMessage>(m => { Execute(); Become(Running); }); }

private void Running() { Receive<Messages.StopCapturingMessage>(m => { _handler.Dispose(); _capturer.Dispose(); Become(Stopped); }); }

private void Stopped() { }

private Capture _capturer; private IDisposable _handler;

public void Execute() { _capturer = new Capture(); WriteLine();

// get a frame per second var framesGrabbed = Observable.FromEventPattern( h => _capturer.ImageGrabbed += h, h => _capturer.ImageGrabbed -= h ) .Sample(TimeSpan.FromSeconds(1));

// frame to bitmap var bitmaps = framesGrabbed.Select( args => ((Capture)args.Sender).QueryFrame().Bitmap );

_handler = bitmaps.Subscribe(bitmap => _recognizer.Tell(bitmap));

_capturer.Start(); }}

private Capture _capturer;private IDisposable _handler;

public void Execute(){ // configuring the camera _capturer = new Capture();

// get a frame per second var framesGrabbed = Observable.FromEventPattern( h => _capturer.ImageGrabbed += h, h => _capturer.ImageGrabbed -= h ) .Sample(TimeSpan.FromSeconds(1));

// frame to bitmap var bitmaps = framesGrabbed.Select( args => ((Capture)args.Sender).QueryFrame().Bitmap );

_handler = bitmaps.Subscribe(bitmap => _recognizer.Tell(bitmap));

_capturer.Start();}

Page 140: Programação reativa e o actor model

_myActorSystem = ActorSystem.Create(“MyActorSystem");

var props = Props.Create(() => new RecognizerActor()) .WithRouter(new RoundRobinPool(10));

var recognizer = _myActorSystem .ActorOf(props, "recognizer");

var capturer = _myActorSystem .ActorOf(Props.Create(() => new CapturerActor(recognizer)), "capturer");

capturer.Tell(Messages.StartCapturing());

Page 142: Programação reativa e o actor model

Programação Reativa e o Actor Model

Elemar Júnior@elemarjr

[email protected]@gmail.com

elemarjr.com