SlideShare une entreprise Scribd logo
1  sur  54
Iteratee: функциональная потоковая обработка
Руслан Шевченко.
Iteratee
структуры данных (Iteratee, Enumerator, Iteratee)
которые определяют состояние процессинга
потока.
●
Разобраться что это такое
●
Построить 'с нуля' подобные интерфейсы
●
Язык scala как псевдокод
●
Показать использование как OO- паттерна
https://github.com/rssh/iteratee-article
Iteratee

Eng. (ee) => rus (уемый)

Trainee – тот кого тренируют

Iteratee – то, что итерируют
Tрадиционный подход
trait Iterator[A]
{
def next: A
def hasNext: Boolean
}
val s = initialState
while(it.hasNext) {
s = doSomething(s,it.next)
}
Наоборот:
trait Iteratee[A,S]
{
def doSomething(whenNext: A,S => S)
}
Наоборот:
trait Iteratee0[A,S]
{
def doSomething(whenNext: A,S => S)
}
Fold: - есть в стандартной библиотеке
trait Collection[A] {
...
def foldLeft(x:S)(f:(S,A)=>S)
...
}
Наоборот:
trait Iteratee[A,S]
{
def doSomething(whenNext: A,S => S)
}
Fold: - есть в стандартной библиотеке
trait Collection[A] {
...
def foldLeft(x:S)(f:(S,A)=>S)
...
}
Fold - свертка
1. Отредуцировать все элементы коллекции
с помощью какой-то операции
Collection[A]: def foldLeft[S](s0:S)((S,A)=>S)
(1 to 10) foldLeft ( _ + _)
2. Произвести разбор случаев и вернуть значение
одного типа:
Either[A,B]: def fold[X](fa: A=>X, fb: B=>X)
Left(“problem x”).fold[String]( “error:” + _ ,
“ok:” + _ )
Fold - свертка
1. Отредуцировать все элементы коллекции
с помощью какой-то операции
Collection[A]: def foldLeft[S](s0:S)((S,A)=>S)
(1 to 10) foldLeft ( _ + _)
2. Произвести разбор случаев и вернуть
значение одного типа:
Either[A,B]: def fold[X](fa: A=>X, fb: B=>X)
Left(“problem x”).fold[String]( “error:” + _ ,
“ok:” + _ )
Коллекция – это то, что дает нам fold
trait Iteratee1[A,S]
{
def fold( whenNext: (S, A) => S,
whenEof: S => S)
}
Коллекция – это то что, дает нам fold
trait Iteratee1[A,S]
{
def fold( whenNext: (S, A) => S,
whenEof: S => S)
}
def run(input,state) =
if (!input.isEmpty && state.isDone) {
state = whenNext(state, input.readElement)
run(input, state)
} else {
whenEof(state)
}
Коллекция – это то, что дает нам fold
trait Iteratee1[A,S]
{
def fold( whenNext: (S, A) => S,
whenEof: S => S)
}
def run(input,state) =
if (!input.isEmpty && !state.isDone) {
state = whenNext(state, input.readElement)
run(input, state)
} else {
whenEof(state)
}
trait Iteratee2[A,S]
{
def fold(whenNext: A => (Iteratee[A,S],S),
whenEnd: S => S)
}
Переходом в следующее состояние управляет
kлиент (тот, кто вызывает fold)
trait Iteratee3[A,S]
{
def fold(whenNext: (A => Iteratee[A,S]) => S),
whenEnd: S => S)
}
Переходом в следующее состояние управляет
коллекция
trait Iteratee3[A,S]
{
def fold(whenNext: (A => Iteratee[A,S]) => S),
whenEnd: S => S)
}
trait Iteratee4[A,S]
{
def fold[B](whenNext: (A => Iteratee[A,S]) => B),
whenEnd: S => B)
}
trait Iteratee4[A,S]
{
def fold[B](whenNext: (A => Iteratee[A,S]) => B),
whenEnd: S => B)
}
def nextStep = fold( identity // f => f,
(s:S) => Function1.constant(this)
);
def isDone = fold( f => false,
(s:S) => true
)
trait Iteratee4[A,S]
{
def fold[B](whenNext: (A => Iteratee[A,S]) => B),
whenEnd: S => B)
}
Секунду – давайте введем еще одно преобразование:
В текущем интерфейса
Введем условное получение следующего элемента
trait Iteratee5[A,S]
{
def fold[B](whenNext: (Input[A]Input[A] => Iteratee[A,S]) => B),
whenEnd: S => B)
}
sealed trait Input[+A]
case class El[+A] extends Input[A]
case object Eol extends Input[Nothing]
+ ....
sealed trait Input[+A]
case class El[+A] extends Input[A]
case object Eof extends Input[Nothing]
+ ....
case class Done[A,S](s:S) extends Iteratee4[A,S]
{
Def fold[B] ( whenNext: (Input[A] => Iteratee4[A,S])=>B,
whenDone: S => S) =
whenDone(s)
}
sum first N [collect]
case class Collect[A](s:String) extends Iteratee[A,String]
{
def fold[B](onNext: (Input[A] => Iteratee[A,String])=>B,
onDone: String => B) =
onNext { case Input.El(a) => Collect(s + a.toString)
case Input.EOF => Done(s)
}
}
case class Collect[A](s:String) extends Iteratee[A,String]
{
def fold[B](onNext: (Input[A] => Iteratee[A,String])=>B,
onDone: String => B) =
onNext { case Input.El(a) => Collect(s + a.toString)
case Input.EOF => Done(s)
}
}
case class Collect[A](s:String) extends Iteratee[A,String]
{
def fold[B](onNext: (Input[A] => Iteratee[A,String])=>B,
onDone: String => B) =
onNext { case Input.El(a) => Collect(s + a.toString)
case Input.EOF => Done(s)
}
}
Enumerator
Генератор элементов
Enumerator
Генератор элементов
Enumerator:
trait Enumerator[A]
{
def apply[S] (it: Iteratee[S,A]): Iteratee[S,A]
}
Сгенерировать элемент == вызвать его обработчик (fold)
case class ListEnumerator[A](l:List[A]) extends MyEnumerator[A]
{
def apply(it: MyIteratee4[S,A]) =
l.foldLeft(it)( (it,e) => it.fold( step => step(Input.El(e)),
Function.const(it)
)
)
}
Compose

Enumerator
(сгенерировать 10 елемент, а потом еще 10)

Iteratee
(принять заголовок пакета, а потом сам пакет)
Compose

Enumerator
(сгенерировать 10 елемент, а потом еще 10)
def compose(x: Enumerator[A], y:Enumerator[A]) =
new Enumerator[A] {
def apply[S](it: Iteratee[A,S]) = y(x(it))
}
Compose

Enumerator
(сгенерировать 10 елемент, а потом еще 10)
def compose(x: Enumerator[A], y:Enumerator[A]) =
new Enumerator[A] {
def apply[S](it: Iteratee[A,S]) = y(x(it))
}
Compose

Iteratee
(принять заголовок пакета, а потом сам пакет)
def compose[A,S](frs: Iteratee[A,S], snd:Iteratee[A,S]) =
new Iteratee[A,S] {
def fold[B](onNext: (Input[A] => Iteratee[A,S])=>B,
onDone: S => B) =
frs.fold( step => onNext(compose(step(_),snd)),
s => snd.fold(onNext,onDone)
)
}
Первое намерение:
Compose

Iteratee -- problems
def compose[A,S](x: MyIteratee[A,S], y:MyIteratee[A,S]) =
new MyIteratee[A,S] {
def fold[B](onNext: (Input[A] => MyIteratee[A,S])=>B,
onDone: S => B) =
frs.fold( step => onNext(compose(step(_),snd)),
s => snd.fold(onNextonNext,onDone)
)
}
Теряем символ
Iteratee - уточнение сигнатуры
trait Iteratee5[A,S]
{
def fold[B](whenNext: (Input[A] => Iteratee[A,S]) => B),
whenEnd: S => B)
}
old
Iteratee - уточнение сигнатуры
trait Iteratee5[A,S]
{
def fold[B](whenNext: (Input[A] => Iteratee[A,S]) => B),
whenEnd: S => B)
}
old
Iteratee - уточнение сигнатуры
trait Iteratee6[A,S]
{
def fold[B](whenNext: (Input[A] => Iteratee[A,S]) => B),
whenDone: (Input[A], S)(Input[A], S) => B)
}
new
sealed trait Input[+A]
case class El[+A] extends Input[A]
case object Eol extends Input[Nothing]
case object EmptyEmpty extends Input[Nothing]
def compose[A,S](frs: MyIteratee[A,S], snd:MyIteratee[A,S]) =
new MyIteratee[A,S] {
def fold[B](onNext: (Input[A] => MyIteratee[A,S])=>B,
onDone: (Input[A],S) => B) =
frs.fold( step => onNext(compose(step(_),snd)),
(in,s) => in match {
case Input.Eof => onDone(in,s)
case Input.Empty => snd.fold(in,s)
case Input.El(a) =>
PutOne(a)(snd).fold(onNext,onDone)
}
)
}
Enumeratee = Iteratee + Enumerator
Enumeratee = Iteratee + Enumerator
Enumeratee = Iteratee + Enumerator
trait Enumeratee[From, To]
{
def transform[S](it: Iteratee[From,S]): Iteratee[To, S]
= JoinIteratee(applyOn(it))
def applyOn[A](it: Iteratee[From,S]):
Iteratee[From,Iteratee[To,S]]
}
case class MapEnumeratee[From,To](f:From => To)
extends Enumeratee[From,To]
{
def applyOn[S](it: Iteratee[To,S]): Iteratee[From, Iteratee[To,S]]=
new Iteratee[From, Iteratee[To,S]] {
def fold[B](onNext, onDone) =
it.fold(
step => onNext( x => applyOn(step(x map f)) ),
(in, s) => onDone(Input.Empty,Done(in,s))
)
}
}
Enumeratee: пример
Доопределить map на Input: Input.El(x) map (f) = Input.El(f(x))
Input.Eof map f = Input.Eof
Input.Empy map f = Input.Empty
Итого:
Абстракции генерирования и потоковой обработки:

Iteratee -- конечное звено обработки элементов (fold)

Enumerator – генератор элементов (apply)

Enumeratee -- преобразователь (transform)

Строить нетривиальные процессы потоковой обработки

Комбинировать в функциональном стиле
FP/OOP

Можно использовать как OOP паттерн

Fold не нужен
trait OOIteratee[A,S]
{
def next(inp: Input[A]): OOIteratee[A,S]
def isDone: Boolean
}
trait OOIteratee[A,S]
{
def next(inp: Input[A]): OOIteratee[A,S]
def whenDone: Option[(Input[A],S)]
def isDone: Boolean = whenDone.isDefined
def whenNext: Option[Input[A]=>MyIteratee[A,S]] =
if (isDone) None else Some(next(_))
}
def fold[B](onNext: (Input[A]=>MyIteratee[A,S])=>B,
onDone: (Input[A],S) => B): B =
if (!isDone) {
onNext( step => next(step) )
} else {
onDone(whenDone.get)
}
Использование в реальной жизни
Scala - обработка потоков в play
http://www.playframework.com/documentation/2.1.1/Iteratees
C# -- Reactice Extensions (Rx)
http://msdn.microsoft.com/en-us/data/gg577609.aspx
Haskell -- Iteratee IO.
http://www.haskell.org/haskellwiki/Iteratee_I/O
Руслан Шевченкo

github : @rssh

https://github.com/rssh/iteratee-article

twitter: @rssh1
http://www.gosave.com
Помогаем монетизировать мобильные приложения

Contenu connexe

En vedette

Thanksgiving english updated
Thanksgiving english updatedThanksgiving english updated
Thanksgiving english updatedSandy Young
 
Formulario del circulo
Formulario del circuloFormulario del circulo
Formulario del circuloThalii TR D PA
 
Mammographic phantom images contrast enhancement
Mammographic phantom images contrast enhancementMammographic phantom images contrast enhancement
Mammographic phantom images contrast enhancementNor'Aida Khairuddin
 
Control de Lengua para 4º de EP y control adaptado para un alumno con TDAH
Control de Lengua para 4º de EP y control adaptado para un alumno con TDAHControl de Lengua para 4º de EP y control adaptado para un alumno con TDAH
Control de Lengua para 4º de EP y control adaptado para un alumno con TDAHEsther Al
 
Thanksgiving chinese updated
Thanksgiving chinese updatedThanksgiving chinese updated
Thanksgiving chinese updatedSandy Young
 
บทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธ
บทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธบทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธ
บทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธยุทธกิจ สัตยาวุธ
 
Innubu @ Betabeers #bbmad 31/05/2013
Innubu @ Betabeers #bbmad 31/05/2013Innubu @ Betabeers #bbmad 31/05/2013
Innubu @ Betabeers #bbmad 31/05/2013David Burgos Risco
 
Produção fotorafica revista nova
Produção fotorafica revista novaProdução fotorafica revista nova
Produção fotorafica revista novaMorgana Gianesini
 
Tungsten carbide nanotubes supported platinum nanoparticles as a
Tungsten carbide nanotubes supported platinum nanoparticles as aTungsten carbide nanotubes supported platinum nanoparticles as a
Tungsten carbide nanotubes supported platinum nanoparticles as aScience Padayatchi
 
Конфликты интересов. Кто кого, умные против красивых?
 Конфликты интересов. Кто кого, умные против красивых? Конфликты интересов. Кто кого, умные против красивых?
Конфликты интересов. Кто кого, умные против красивых?Yuliia Zolotarenko
 
Rpp kelas xii semester 1 edit 1
Rpp kelas xii semester 1 edit 1Rpp kelas xii semester 1 edit 1
Rpp kelas xii semester 1 edit 1sofian_aritonang
 
AAC Block plant in india
AAC Block plant in indiaAAC Block plant in india
AAC Block plant in indiagubbiseo
 
Servicio cliente-Servicio cristiano
Servicio cliente-Servicio cristianoServicio cliente-Servicio cristiano
Servicio cliente-Servicio cristianoJuan Niño de Guzman
 
1 jurnal zainuri_1-17
1 jurnal zainuri_1-171 jurnal zainuri_1-17
1 jurnal zainuri_1-17Hotma Purba
 
Abhinandan_Sen_3D_CV_latest
Abhinandan_Sen_3D_CV_latestAbhinandan_Sen_3D_CV_latest
Abhinandan_Sen_3D_CV_latestAbhinandan Sen
 

En vedette (20)

Thanksgiving english updated
Thanksgiving english updatedThanksgiving english updated
Thanksgiving english updated
 
Formulario del circulo
Formulario del circuloFormulario del circulo
Formulario del circulo
 
Camino al futuro bill gates
Camino al futuro   bill gatesCamino al futuro   bill gates
Camino al futuro bill gates
 
Mammographic phantom images contrast enhancement
Mammographic phantom images contrast enhancementMammographic phantom images contrast enhancement
Mammographic phantom images contrast enhancement
 
Control de Lengua para 4º de EP y control adaptado para un alumno con TDAH
Control de Lengua para 4º de EP y control adaptado para un alumno con TDAHControl de Lengua para 4º de EP y control adaptado para un alumno con TDAH
Control de Lengua para 4º de EP y control adaptado para un alumno con TDAH
 
Thanksgiving chinese updated
Thanksgiving chinese updatedThanksgiving chinese updated
Thanksgiving chinese updated
 
บทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธ
บทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธบทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธ
บทสรุปสำหรับผู้บริหาร โรงเรียนวิถีพุทธ
 
Innubu @ Betabeers #bbmad 31/05/2013
Innubu @ Betabeers #bbmad 31/05/2013Innubu @ Betabeers #bbmad 31/05/2013
Innubu @ Betabeers #bbmad 31/05/2013
 
하이플럭스 국문 카달로그 2014 (Korea)
하이플럭스 국문 카달로그 2014 (Korea)하이플럭스 국문 카달로그 2014 (Korea)
하이플럭스 국문 카달로그 2014 (Korea)
 
Produção fotorafica revista nova
Produção fotorafica revista novaProdução fotorafica revista nova
Produção fotorafica revista nova
 
Tungsten carbide nanotubes supported platinum nanoparticles as a
Tungsten carbide nanotubes supported platinum nanoparticles as aTungsten carbide nanotubes supported platinum nanoparticles as a
Tungsten carbide nanotubes supported platinum nanoparticles as a
 
Конфликты интересов. Кто кого, умные против красивых?
 Конфликты интересов. Кто кого, умные против красивых? Конфликты интересов. Кто кого, умные против красивых?
Конфликты интересов. Кто кого, умные против красивых?
 
Mobility Intro
Mobility IntroMobility Intro
Mobility Intro
 
En aquellos dias
En  aquellos   diasEn  aquellos   dias
En aquellos dias
 
Rpp kelas xii semester 1 edit 1
Rpp kelas xii semester 1 edit 1Rpp kelas xii semester 1 edit 1
Rpp kelas xii semester 1 edit 1
 
AAC Block plant in india
AAC Block plant in indiaAAC Block plant in india
AAC Block plant in india
 
Sistemas de Vegetacao
Sistemas de VegetacaoSistemas de Vegetacao
Sistemas de Vegetacao
 
Servicio cliente-Servicio cristiano
Servicio cliente-Servicio cristianoServicio cliente-Servicio cristiano
Servicio cliente-Servicio cristiano
 
1 jurnal zainuri_1-17
1 jurnal zainuri_1-171 jurnal zainuri_1-17
1 jurnal zainuri_1-17
 
Abhinandan_Sen_3D_CV_latest
Abhinandan_Sen_3D_CV_latestAbhinandan_Sen_3D_CV_latest
Abhinandan_Sen_3D_CV_latest
 

Similaire à Iteratee explained.

Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Функциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевФункциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевAleksander Alekseev
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
[Не]практичные типы
[Не]практичные типы[Не]практичные типы
[Не]практичные типыVasil Remeniuk
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхDmitry Protopopov
 
практика 13
практика 13практика 13
практика 13student_kai
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...Mail.ru Group
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Идиоматичный функциональный код
Идиоматичный функциональный кодИдиоматичный функциональный код
Идиоматичный функциональный кодAlexander Granin
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
производящие функции(продолжение)
производящие функции(продолжение)производящие функции(продолжение)
производящие функции(продолжение)Mariya_Lastochkina
 

Similaire à Iteratee explained. (20)

Scala #3
Scala #3Scala #3
Scala #3
 
Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.Урок 7. Интерпретация и компиляция функциональных программ.
Урок 7. Интерпретация и компиляция функциональных программ.
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Функциональное программирование - Александр Алексеев
Функциональное программирование - Александр АлексеевФункциональное программирование - Александр Алексеев
Функциональное программирование - Александр Алексеев
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
[Не]практичные типы
[Не]практичные типы[Не]практичные типы
[Не]практичные типы
 
Функциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядковФункциональное программирование.Списки. Функции высших порядков
Функциональное программирование.Списки. Функции высших порядков
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменных
 
практика 13
практика 13практика 13
практика 13
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Идиоматичный функциональный код
Идиоматичный функциональный кодИдиоматичный функциональный код
Идиоматичный функциональный код
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Scala on android
Scala on androidScala on android
Scala on android
 
производящие функции(продолжение)
производящие функции(продолжение)производящие функции(продолжение)
производящие функции(продолжение)
 
Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.
 

Plus de Ruslan Shevchenko

Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]Ruslan Shevchenko
 
Papers We Love / Kyiv : PAXOS (and little about other consensuses )
Papers We Love / Kyiv :  PAXOS (and little about other consensuses )Papers We Love / Kyiv :  PAXOS (and little about other consensuses )
Papers We Love / Kyiv : PAXOS (and little about other consensuses )Ruslan Shevchenko
 
Scala / Technology evolution
Scala  / Technology evolutionScala  / Technology evolution
Scala / Technology evolutionRuslan Shevchenko
 
{co/contr} variance from LSP
{co/contr} variance  from LSP{co/contr} variance  from LSP
{co/contr} variance from LSPRuslan Shevchenko
 
Scala-Gopher: CSP-style programming techniques with idiomatic Scala.
Scala-Gopher: CSP-style programming techniques with idiomatic Scala.Scala-Gopher: CSP-style programming techniques with idiomatic Scala.
Scala-Gopher: CSP-style programming techniques with idiomatic Scala.Ruslan Shevchenko
 
SE 20016 - programming languages landscape.
SE 20016 - programming languages landscape.SE 20016 - programming languages landscape.
SE 20016 - programming languages landscape.Ruslan Shevchenko
 
Few simple-type-tricks in scala
Few simple-type-tricks in scalaFew simple-type-tricks in scala
Few simple-type-tricks in scalaRuslan Shevchenko
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisRuslan Shevchenko
 
Java & low latency applications
Java & low latency applicationsJava & low latency applications
Java & low latency applicationsRuslan Shevchenko
 
Jslab rssh: JS as language platform
Jslab rssh:  JS as language platformJslab rssh:  JS as language platform
Jslab rssh: JS as language platformRuslan Shevchenko
 
Behind OOD: domain modelling in post-OO world.
Behind OOD:  domain modelling in post-OO world.Behind OOD:  domain modelling in post-OO world.
Behind OOD: domain modelling in post-OO world.Ruslan Shevchenko
 
scala-gopher: async implementation of CSP for scala
scala-gopher:  async implementation of CSP  for  scalascala-gopher:  async implementation of CSP  for  scala
scala-gopher: async implementation of CSP for scalaRuslan Shevchenko
 
Programming Languages: some news for the last N years
Programming Languages: some news for the last N yearsProgramming Languages: some news for the last N years
Programming Languages: some news for the last N yearsRuslan Shevchenko
 

Plus de Ruslan Shevchenko (20)

Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]Embedding Generic Monadic Transformer into Scala. [Tfp2022]
Embedding Generic Monadic Transformer into Scala. [Tfp2022]
 
Svitla talks 2021_03_25
Svitla talks 2021_03_25Svitla talks 2021_03_25
Svitla talks 2021_03_25
 
Akka / Lts behavior
Akka / Lts behaviorAkka / Lts behavior
Akka / Lts behavior
 
Papers We Love / Kyiv : PAXOS (and little about other consensuses )
Papers We Love / Kyiv :  PAXOS (and little about other consensuses )Papers We Love / Kyiv :  PAXOS (and little about other consensuses )
Papers We Love / Kyiv : PAXOS (and little about other consensuses )
 
Scala / Technology evolution
Scala  / Technology evolutionScala  / Technology evolution
Scala / Technology evolution
 
{co/contr} variance from LSP
{co/contr} variance  from LSP{co/contr} variance  from LSP
{co/contr} variance from LSP
 
N flavors of streaming
N flavors of streamingN flavors of streaming
N flavors of streaming
 
Scala-Gopher: CSP-style programming techniques with idiomatic Scala.
Scala-Gopher: CSP-style programming techniques with idiomatic Scala.Scala-Gopher: CSP-style programming techniques with idiomatic Scala.
Scala-Gopher: CSP-style programming techniques with idiomatic Scala.
 
SE 20016 - programming languages landscape.
SE 20016 - programming languages landscape.SE 20016 - programming languages landscape.
SE 20016 - programming languages landscape.
 
Few simple-type-tricks in scala
Few simple-type-tricks in scalaFew simple-type-tricks in scala
Few simple-type-tricks in scala
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with this
 
Scala jargon cheatsheet
Scala jargon cheatsheetScala jargon cheatsheet
Scala jargon cheatsheet
 
Java & low latency applications
Java & low latency applicationsJava & low latency applications
Java & low latency applications
 
Csp scala wixmeetup2016
Csp scala wixmeetup2016Csp scala wixmeetup2016
Csp scala wixmeetup2016
 
IDLs
IDLsIDLs
IDLs
 
R ext world/ useR! Kiev
R ext world/ useR!  KievR ext world/ useR!  Kiev
R ext world/ useR! Kiev
 
Jslab rssh: JS as language platform
Jslab rssh:  JS as language platformJslab rssh:  JS as language platform
Jslab rssh: JS as language platform
 
Behind OOD: domain modelling in post-OO world.
Behind OOD:  domain modelling in post-OO world.Behind OOD:  domain modelling in post-OO world.
Behind OOD: domain modelling in post-OO world.
 
scala-gopher: async implementation of CSP for scala
scala-gopher:  async implementation of CSP  for  scalascala-gopher:  async implementation of CSP  for  scala
scala-gopher: async implementation of CSP for scala
 
Programming Languages: some news for the last N years
Programming Languages: some news for the last N yearsProgramming Languages: some news for the last N years
Programming Languages: some news for the last N years
 

Iteratee explained.

  • 1. Iteratee: функциональная потоковая обработка Руслан Шевченко.
  • 2. Iteratee структуры данных (Iteratee, Enumerator, Iteratee) которые определяют состояние процессинга потока. ● Разобраться что это такое ● Построить 'с нуля' подобные интерфейсы ● Язык scala как псевдокод ● Показать использование как OO- паттерна https://github.com/rssh/iteratee-article
  • 3. Iteratee  Eng. (ee) => rus (уемый)  Trainee – тот кого тренируют  Iteratee – то, что итерируют
  • 4. Tрадиционный подход trait Iterator[A] { def next: A def hasNext: Boolean } val s = initialState while(it.hasNext) { s = doSomething(s,it.next) }
  • 6. Наоборот: trait Iteratee0[A,S] { def doSomething(whenNext: A,S => S) } Fold: - есть в стандартной библиотеке trait Collection[A] { ... def foldLeft(x:S)(f:(S,A)=>S) ... }
  • 7. Наоборот: trait Iteratee[A,S] { def doSomething(whenNext: A,S => S) } Fold: - есть в стандартной библиотеке trait Collection[A] { ... def foldLeft(x:S)(f:(S,A)=>S) ... }
  • 8. Fold - свертка 1. Отредуцировать все элементы коллекции с помощью какой-то операции Collection[A]: def foldLeft[S](s0:S)((S,A)=>S) (1 to 10) foldLeft ( _ + _) 2. Произвести разбор случаев и вернуть значение одного типа: Either[A,B]: def fold[X](fa: A=>X, fb: B=>X) Left(“problem x”).fold[String]( “error:” + _ , “ok:” + _ )
  • 9. Fold - свертка 1. Отредуцировать все элементы коллекции с помощью какой-то операции Collection[A]: def foldLeft[S](s0:S)((S,A)=>S) (1 to 10) foldLeft ( _ + _) 2. Произвести разбор случаев и вернуть значение одного типа: Either[A,B]: def fold[X](fa: A=>X, fb: B=>X) Left(“problem x”).fold[String]( “error:” + _ , “ok:” + _ )
  • 10. Коллекция – это то, что дает нам fold trait Iteratee1[A,S] { def fold( whenNext: (S, A) => S, whenEof: S => S) }
  • 11. Коллекция – это то что, дает нам fold trait Iteratee1[A,S] { def fold( whenNext: (S, A) => S, whenEof: S => S) } def run(input,state) = if (!input.isEmpty && state.isDone) { state = whenNext(state, input.readElement) run(input, state) } else { whenEof(state) }
  • 12. Коллекция – это то, что дает нам fold trait Iteratee1[A,S] { def fold( whenNext: (S, A) => S, whenEof: S => S) } def run(input,state) = if (!input.isEmpty && !state.isDone) { state = whenNext(state, input.readElement) run(input, state) } else { whenEof(state) }
  • 13. trait Iteratee2[A,S] { def fold(whenNext: A => (Iteratee[A,S],S), whenEnd: S => S) } Переходом в следующее состояние управляет kлиент (тот, кто вызывает fold)
  • 14. trait Iteratee3[A,S] { def fold(whenNext: (A => Iteratee[A,S]) => S), whenEnd: S => S) } Переходом в следующее состояние управляет коллекция
  • 15. trait Iteratee3[A,S] { def fold(whenNext: (A => Iteratee[A,S]) => S), whenEnd: S => S) }
  • 16. trait Iteratee4[A,S] { def fold[B](whenNext: (A => Iteratee[A,S]) => B), whenEnd: S => B) }
  • 17. trait Iteratee4[A,S] { def fold[B](whenNext: (A => Iteratee[A,S]) => B), whenEnd: S => B) }
  • 18. def nextStep = fold( identity // f => f, (s:S) => Function1.constant(this) ); def isDone = fold( f => false, (s:S) => true )
  • 19.
  • 20.
  • 21.
  • 22. trait Iteratee4[A,S] { def fold[B](whenNext: (A => Iteratee[A,S]) => B), whenEnd: S => B) } Секунду – давайте введем еще одно преобразование: В текущем интерфейса Введем условное получение следующего элемента
  • 23. trait Iteratee5[A,S] { def fold[B](whenNext: (Input[A]Input[A] => Iteratee[A,S]) => B), whenEnd: S => B) } sealed trait Input[+A] case class El[+A] extends Input[A] case object Eol extends Input[Nothing] + ....
  • 24. sealed trait Input[+A] case class El[+A] extends Input[A] case object Eof extends Input[Nothing] + ....
  • 25. case class Done[A,S](s:S) extends Iteratee4[A,S] { Def fold[B] ( whenNext: (Input[A] => Iteratee4[A,S])=>B, whenDone: S => S) = whenDone(s) }
  • 26. sum first N [collect]
  • 27. case class Collect[A](s:String) extends Iteratee[A,String] { def fold[B](onNext: (Input[A] => Iteratee[A,String])=>B, onDone: String => B) = onNext { case Input.El(a) => Collect(s + a.toString) case Input.EOF => Done(s) } }
  • 28. case class Collect[A](s:String) extends Iteratee[A,String] { def fold[B](onNext: (Input[A] => Iteratee[A,String])=>B, onDone: String => B) = onNext { case Input.El(a) => Collect(s + a.toString) case Input.EOF => Done(s) } }
  • 29. case class Collect[A](s:String) extends Iteratee[A,String] { def fold[B](onNext: (Input[A] => Iteratee[A,String])=>B, onDone: String => B) = onNext { case Input.El(a) => Collect(s + a.toString) case Input.EOF => Done(s) } }
  • 32. Enumerator: trait Enumerator[A] { def apply[S] (it: Iteratee[S,A]): Iteratee[S,A] } Сгенерировать элемент == вызвать его обработчик (fold)
  • 33. case class ListEnumerator[A](l:List[A]) extends MyEnumerator[A] { def apply(it: MyIteratee4[S,A]) = l.foldLeft(it)( (it,e) => it.fold( step => step(Input.El(e)), Function.const(it) ) ) }
  • 34. Compose  Enumerator (сгенерировать 10 елемент, а потом еще 10)  Iteratee (принять заголовок пакета, а потом сам пакет)
  • 35. Compose  Enumerator (сгенерировать 10 елемент, а потом еще 10) def compose(x: Enumerator[A], y:Enumerator[A]) = new Enumerator[A] { def apply[S](it: Iteratee[A,S]) = y(x(it)) }
  • 36. Compose  Enumerator (сгенерировать 10 елемент, а потом еще 10) def compose(x: Enumerator[A], y:Enumerator[A]) = new Enumerator[A] { def apply[S](it: Iteratee[A,S]) = y(x(it)) }
  • 37. Compose  Iteratee (принять заголовок пакета, а потом сам пакет) def compose[A,S](frs: Iteratee[A,S], snd:Iteratee[A,S]) = new Iteratee[A,S] { def fold[B](onNext: (Input[A] => Iteratee[A,S])=>B, onDone: S => B) = frs.fold( step => onNext(compose(step(_),snd)), s => snd.fold(onNext,onDone) ) } Первое намерение:
  • 38. Compose  Iteratee -- problems def compose[A,S](x: MyIteratee[A,S], y:MyIteratee[A,S]) = new MyIteratee[A,S] { def fold[B](onNext: (Input[A] => MyIteratee[A,S])=>B, onDone: S => B) = frs.fold( step => onNext(compose(step(_),snd)), s => snd.fold(onNextonNext,onDone) ) } Теряем символ
  • 39. Iteratee - уточнение сигнатуры trait Iteratee5[A,S] { def fold[B](whenNext: (Input[A] => Iteratee[A,S]) => B), whenEnd: S => B) } old
  • 40. Iteratee - уточнение сигнатуры trait Iteratee5[A,S] { def fold[B](whenNext: (Input[A] => Iteratee[A,S]) => B), whenEnd: S => B) } old
  • 41. Iteratee - уточнение сигнатуры trait Iteratee6[A,S] { def fold[B](whenNext: (Input[A] => Iteratee[A,S]) => B), whenDone: (Input[A], S)(Input[A], S) => B) } new
  • 42. sealed trait Input[+A] case class El[+A] extends Input[A] case object Eol extends Input[Nothing] case object EmptyEmpty extends Input[Nothing]
  • 43. def compose[A,S](frs: MyIteratee[A,S], snd:MyIteratee[A,S]) = new MyIteratee[A,S] { def fold[B](onNext: (Input[A] => MyIteratee[A,S])=>B, onDone: (Input[A],S) => B) = frs.fold( step => onNext(compose(step(_),snd)), (in,s) => in match { case Input.Eof => onDone(in,s) case Input.Empty => snd.fold(in,s) case Input.El(a) => PutOne(a)(snd).fold(onNext,onDone) } ) }
  • 44.
  • 45. Enumeratee = Iteratee + Enumerator
  • 46. Enumeratee = Iteratee + Enumerator
  • 47. Enumeratee = Iteratee + Enumerator trait Enumeratee[From, To] { def transform[S](it: Iteratee[From,S]): Iteratee[To, S] = JoinIteratee(applyOn(it)) def applyOn[A](it: Iteratee[From,S]): Iteratee[From,Iteratee[To,S]] }
  • 48. case class MapEnumeratee[From,To](f:From => To) extends Enumeratee[From,To] { def applyOn[S](it: Iteratee[To,S]): Iteratee[From, Iteratee[To,S]]= new Iteratee[From, Iteratee[To,S]] { def fold[B](onNext, onDone) = it.fold( step => onNext( x => applyOn(step(x map f)) ), (in, s) => onDone(Input.Empty,Done(in,s)) ) } } Enumeratee: пример Доопределить map на Input: Input.El(x) map (f) = Input.El(f(x)) Input.Eof map f = Input.Eof Input.Empy map f = Input.Empty
  • 49. Итого: Абстракции генерирования и потоковой обработки:  Iteratee -- конечное звено обработки элементов (fold)  Enumerator – генератор элементов (apply)  Enumeratee -- преобразователь (transform)  Строить нетривиальные процессы потоковой обработки  Комбинировать в функциональном стиле
  • 50. FP/OOP  Можно использовать как OOP паттерн  Fold не нужен trait OOIteratee[A,S] { def next(inp: Input[A]): OOIteratee[A,S] def isDone: Boolean }
  • 51. trait OOIteratee[A,S] { def next(inp: Input[A]): OOIteratee[A,S] def whenDone: Option[(Input[A],S)] def isDone: Boolean = whenDone.isDefined def whenNext: Option[Input[A]=>MyIteratee[A,S]] = if (isDone) None else Some(next(_)) }
  • 52. def fold[B](onNext: (Input[A]=>MyIteratee[A,S])=>B, onDone: (Input[A],S) => B): B = if (!isDone) { onNext( step => next(step) ) } else { onDone(whenDone.get) }
  • 53. Использование в реальной жизни Scala - обработка потоков в play http://www.playframework.com/documentation/2.1.1/Iteratees C# -- Reactice Extensions (Rx) http://msdn.microsoft.com/en-us/data/gg577609.aspx Haskell -- Iteratee IO. http://www.haskell.org/haskellwiki/Iteratee_I/O
  • 54. Руслан Шевченкo  github : @rssh  https://github.com/rssh/iteratee-article  twitter: @rssh1 http://www.gosave.com Помогаем монетизировать мобильные приложения