SlideShare a Scribd company logo
1 of 90
Download to read offline
Effector
we need

to go deeper
Photo by Cristian Palmer on Unsplash
Effector: we need to go deeper
fx
fx
fx
const fx = createEffect({ })
fx.done.watch( )
fx()
fx()
fx()
Effector: we need to go deeper
Effector: we need to go deeper
{
name: "Victor Didenko",
website: "yumaa.name",
email: "me@yumaa.name",
telegram: "@yumauri",
job: "setplex.com"
}
name

born



died



job
Leonhard Euler

April 15, 1707,

Basel, Switzerland

September 18, 1783,

Saint Petersburg

mathematician,

physicist,

astronomer,

geographer,

logician,

engineer
Effector: we need to go deeper
Effector: we need to go deeper
Effector: we need to go deeper
???
Photo by Alina Grubnyak on Unsplash
Graphs
Graph
Graph
Graph
Graph
Graph
Graph
¯_(ツ)_/¯
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
https: share.effector.dev/XA1nnzXu
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
change
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
counter
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
counter
foo
bar
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
counter
foo
bar
foobar
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
counter
foo
bar
foobar
updates
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
counter
foo
bar
foobar
updates
filterMap
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
counter
foo
bar
foobar
updates
filterMap
sample
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
changeonclick
increment
decrement
counter
foo
bar
foobar
updates
filterMap
sample
const change = createEvent()
const onclick = change.prepend(
e e.target.innerText
)
const { increment, decrement } = split(change, {
increment: value value '+',
decrement: value value '-'
})
const counter = createStore(1)
.on(increment, state state + 1)
.on(decrement, state state - 1)
const foo = counter.map(state state % 3 ? '' : 'foo')
const bar = counter.map(state state % 5 ? '' : 'bar')
const foobar = combine(foo, bar,
(foo, bar) foo bar ? foo + bar : null
)
sample({
source: change,
clock: foobar.updates.filterMap(value value undefined),
target: change
})
change
onclick
increment
decrement
counter
foo bar
foobar
updates
filterMap
sample
Graph
Effector
Photo by Mathew Schwartz on Unsplash
https: github.com/zerobias/effector/blob/master/src/effector/index.h.js#L33
interface Node {
next: Node[]
seq: Step[]
scope: { [name: string]: any }
reg: { [id: string]: StateRef }
meta: { [tag: string]: any }
family: {
type: 'regular' | 'crosslink' | 'domain'
links: Node[]
owners: Node[]
}
}
type Step =
| Compute
| Filter
| Barrier
| Run
| Check
| Mov
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
data
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
data
queue1
1
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
queue1
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
queue
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
queue2 3
2
3
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
queue2 3
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
queue3
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
queue3 4 5
4
5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue3 4 5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue4 5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue4 5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue4 5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue5
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue
{seq: [Step, Step, Step], next: [ , ]}
{seq: [Step, Step], next: [ , ]}
{seq: [Step, Step, Step], next: []}
{seq: [], next: []}
{seq: [Step, Step, Step], next: []}
1
2
3
4
5
queue
1
2
3
4
5
data
???
???
queue
{seq: [Step, Step, Step], next: []}
???
event store effect
Data
return event
}
export function createEvent() {
const event = (payload) {
launch(event, payload)
return payload
}
event
kernel
event.graphite = {
seq: [],
next: [],
meta: { unit: 'event' },
scope: {},
family: {
type: 'regular',
links: [],
owners: [],
},
reg: {}
}
return event
}
export function createEvent() {
const event = (payload) {
launch(event, payload)
return payload
}
event
event.graphite = {
seq: [],
next: [],
meta: { unit: 'event' },
scope: {},
family: {
type: 'regular',
links: [],
owners: [],
},
reg: {}
}
return event
}
export function createEvent() {
const event = (payload) {
launch(event, payload)
return payload
}
event
(any).graphite: Node
fn() + .graphite
event
{} + .graphite
store
effect
fn() + .graphite
(any) + .graphite
???
interface Node {
next: Node[]
seq: Step[]
scope: { [name: string]: any }
reg: { [id: string]: StateRef }
meta: { [tag: string]: any }
family: {
type: 'regular' | 'crosslink' | 'domain'
links: Node[]
owners: Node[]
}
}
type Step =
| Compute
| Filter
| Barrier
| Run
| Check
| Mov
Steps
type Step = Compute | Filter | Barrier | Run | Check | Mov
import { step } from 'effector'
step.compute({
fn(data, scope) {
8<
return data
}
})
step.filter({
fn(data, scope) {
8<
return true false
},
})
step.barrier({
priority: 'barrier' 'sampler'
})
step.run({
fn(data, scope) {
8<
return data
}
})
step.check.defined()
step.check.changed({
store: StateRef
})
step.mov({ 8< })
queuequeue
Queues
queue
child
sampler
effect
barrier
pure
Priority
High
Low
next:[ ]
launch( )
step.barrier({
priority: 'barrier'
step.barrier({
priority: 'sampler'
step.run( )
Diamond problem
(Glitches problem)
const setName = createEvent()
const fullName = createStore('')
.on(setName, (_, name) name)
const firstName = fullName.map(
first first.split(' ')[0] ''
)
const lastName = fullName.map(
last last.split(' ')[1] ''
)
const reverseName = combine(
firstName,
lastName,
(first, last) `${last} ${first}`
)
reverseName.watch(
name console.log('reversed name:', name)
)
setName('Victor Didenko')
setName fullName
firstName lastName
reverseName
watch
const setName = createEvent()
const fullName = createStore('')
.on(setName, (_, name) name)
const firstName = fullName.map(
first first.split(' ')[0] ''
)
const lastName = fullName.map(
last last.split(' ')[1] ''
)
const reverseName = combine(
firstName,
lastName,
(first, last) `${last} ${first}`
)
reverseName.watch(
name console.log('reversed name:', name)
)
setName('Victor Didenko')
setName fullName
firstName lastName
reverseName
watch
Victor
Didenko
Victor
Didenko
Victor Didenko
const setName = createEvent()
const fullName = createStore('')
.on(setName, (_, name) name)
const firstName = fullName.map(
first first.split(' ')[0] ''
)
const lastName = fullName.map(
last last.split(' ')[1] ''
)
const reverseName = combine(
firstName,
lastName,
(first, last) `${last} ${first}`
)
reverseName.watch(
name console.log('reversed name:', name)
)
setName('Victor Didenko')
setName fullName
firstName lastName
reverseName
watch
Victor
Didenko
Victor
Didenko
Victor Didenko
Victor
const setName = createEvent()
const fullName = createStore('')
.on(setName, (_, name) name)
const firstName = fullName.map(
first first.split(' ')[0] ''
)
const lastName = fullName.map(
last last.split(' ')[1] ''
)
const reverseName = combine(
firstName,
lastName,
(first, last) `${last} ${first}`
)
reverseName.watch(
name console.log('reversed name:', name)
)
setName('Victor Didenko')
setName fullName
firstName lastName
reverseName
watch
Victor
Didenko
Victor
Didenko
Victor Didenko
Didenko
Victor
const setName = createEvent()
const fullName = createStore('')
.on(setName, (_, name) name)
const firstName = fullName.map(
first first.split(' ')[0] ''
)
const lastName = fullName.map(
last last.split(' ')[1] ''
)
const reverseName = combine(
firstName,
lastName,
(first, last) `${last} ${first}`
)
reverseName.watch(
name console.log('reversed name:', name)
)
setName('Victor Didenko')
setName fullName
firstName lastName
reverseName
watch
Victor
Didenko
Victor
Didenko
Victor Didenko
Didenko
Victor
???
setName fullName
firstName lastName
reverseName
watch
setName
fullName
firstName lastName
reverseName
watch
setName
firstName lastName
reverseName
watch
.updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
setName
firstName lastName
reverseName
watch
.updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Reducer
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
reverseName
watch
.updates .updates
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
reverseName
watch
.updates .updates
Map function
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
childfirstName lastName
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
childfirstName lastName
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
childlastName combine
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
childcombinecombine
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
child
barrier
combine
combine
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
child
barrier
combine
combine
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
child
barriercombine
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
Solve diamond
Combine function
child
barrier
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
watch
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
MovCheck(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
.updates
Solve diamond
Combine function
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
Mov
.updates
watch
Run
Check(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
setName .updates
fullName
Check(defined)
Mov
Check(changed)
Mov
Mov
Compute
Check(defined)
Check(changed)
Mov
.on
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
Mov
Compute
Check(defined)
Check(changed)
Mov
.map
firstName
Check(defined)
Mov
Check(changed)
Mov
lastName
Check(defined)
Mov
Check(changed)
Mov
.updates .updates
reverseName
Check(defined)
Mov
Check(changed)
Mov
.updates
watch
Run
Check(defined)
Mov
Filter
Mov
Compute
Mov
Mov
Barrier
Mov
Mov
Compute
Check(changed)
combine
Effector: we need to go deeper
Photo by Petar Petkovski on Unsplash
Why?
Photo by Petar Petkovski on Unsplash
Why?
:%s/graph/network/g
function createFuture () {
const future = createEvent()
future.graphite.seq.push(
step.filter({
fn: payload
!(payload instanceof Promise)
? true
: void payload
.then(result launch(future, result))
})
)
return future
}
const future = createFuture()
future.watch(_ console.log('future:', _))
future(1)
future(Promise.resolve(2))
future(3) future: 1
future: 3
future: 2
future
Photo by Clint Adair on Unsplash
Bad programmers worry about
the code. Good programmers
worry about data structures
and their relationships.
Linus Torvalds

More Related Content

What's hot

Javasccript MV* frameworks
Javasccript MV* frameworksJavasccript MV* frameworks
Javasccript MV* frameworksKerry Buckley
 
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingDevnology
 
Advanced Data Visualization Examples with R-Part II
Advanced Data Visualization Examples with R-Part IIAdvanced Data Visualization Examples with R-Part II
Advanced Data Visualization Examples with R-Part IIDr. Volkan OBAN
 
레진코믹스가 코틀린으로 간 까닭은?
레진코믹스가 코틀린으로 간 까닭은?레진코믹스가 코틀린으로 간 까닭은?
레진코믹스가 코틀린으로 간 까닭은?Taeho Kim
 
Kotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great AgainKotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great AgainTaeho Kim
 
Artificial intelligence
Artificial intelligenceArtificial intelligence
Artificial intelligenceAditya Sharma
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드Taeho Kim
 
Atomically { Delete Your Actors }
Atomically { Delete Your Actors }Atomically { Delete Your Actors }
Atomically { Delete Your Actors }John De Goes
 
Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...
Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...
Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...Dr. Volkan OBAN
 
A Survey Of R Graphics
A Survey Of R GraphicsA Survey Of R Graphics
A Survey Of R GraphicsDataspora
 
Simpson and lagranje dalambair math methods
Simpson and lagranje dalambair math methods Simpson and lagranje dalambair math methods
Simpson and lagranje dalambair math methods kinan keshkeh
 

What's hot (20)

Basic Calculus in R.
Basic Calculus in R. Basic Calculus in R.
Basic Calculus in R.
 
Javasccript MV* frameworks
Javasccript MV* frameworksJavasccript MV* frameworks
Javasccript MV* frameworks
 
mobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkelingmobl: Een DSL voor mobiele applicatieontwikkeling
mobl: Een DSL voor mobiele applicatieontwikkeling
 
R meets Hadoop
R meets HadoopR meets Hadoop
R meets Hadoop
 
Advanced Data Visualization Examples with R-Part II
Advanced Data Visualization Examples with R-Part IIAdvanced Data Visualization Examples with R-Part II
Advanced Data Visualization Examples with R-Part II
 
RHadoop の紹介
RHadoop の紹介RHadoop の紹介
RHadoop の紹介
 
레진코믹스가 코틀린으로 간 까닭은?
레진코믹스가 코틀린으로 간 까닭은?레진코믹스가 코틀린으로 간 까닭은?
레진코믹스가 코틀린으로 간 까닭은?
 
Mosaic plot in R.
Mosaic plot in R.Mosaic plot in R.
Mosaic plot in R.
 
Kotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great AgainKotlin: Let's Make Android Great Again
Kotlin: Let's Make Android Great Again
 
Artificial intelligence
Artificial intelligenceArtificial intelligence
Artificial intelligence
 
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
(안드로이드 개발자를 위한) 오픈소스 라이브러리 사용 가이드
 
Atomically { Delete Your Actors }
Atomically { Delete Your Actors }Atomically { Delete Your Actors }
Atomically { Delete Your Actors }
 
Java Fx Tutorial01
Java Fx Tutorial01Java Fx Tutorial01
Java Fx Tutorial01
 
Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...
Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...
Some R Examples[R table and Graphics] -Advanced Data Visualization in R (Some...
 
A Survey Of R Graphics
A Survey Of R GraphicsA Survey Of R Graphics
A Survey Of R Graphics
 
A Shiny Example-- R
A Shiny Example-- RA Shiny Example-- R
A Shiny Example-- R
 
Introduction to R
Introduction to RIntroduction to R
Introduction to R
 
Simpson and lagranje dalambair math methods
Simpson and lagranje dalambair math methods Simpson and lagranje dalambair math methods
Simpson and lagranje dalambair math methods
 
Myraytracer
MyraytracerMyraytracer
Myraytracer
 
Ray tracing with ZIO-ZLayer
Ray tracing with ZIO-ZLayerRay tracing with ZIO-ZLayer
Ray tracing with ZIO-ZLayer
 

Similar to Effector: we need to go deeper

Swift 함수 커링 사용하기
Swift 함수 커링 사용하기Swift 함수 커링 사용하기
Swift 함수 커링 사용하기진성 오
 
Kotlin collections
Kotlin collectionsKotlin collections
Kotlin collectionsMyeongin Woo
 
The Essence of the Iterator Pattern
The Essence of the Iterator PatternThe Essence of the Iterator Pattern
The Essence of the Iterator PatternEric Torreborre
 
Implementing Software Machines in C and Go
Implementing Software Machines in C and GoImplementing Software Machines in C and Go
Implementing Software Machines in C and GoEleanor McHugh
 
The Essence of the Iterator Pattern (pdf)
The Essence of the Iterator Pattern (pdf)The Essence of the Iterator Pattern (pdf)
The Essence of the Iterator Pattern (pdf)Eric Torreborre
 
Go Beast Mode with Realtime Reactive Interfaces in Angular 2 and Firebase
Go Beast Mode with Realtime Reactive Interfaces in Angular 2 and FirebaseGo Beast Mode with Realtime Reactive Interfaces in Angular 2 and Firebase
Go Beast Mode with Realtime Reactive Interfaces in Angular 2 and FirebaseLukas Ruebbelke
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfarihantmobileselepun
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React AlicanteIgnacio Martín
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Ignacio Martín
 
関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)riue
 
Watch out: Observables are here to stay
Watch out: Observables are here to stayWatch out: Observables are here to stay
Watch out: Observables are here to stayGuilherme Ventura
 
Let it Flow - Introduction to Functional Reactive Programming
Let it Flow - Introduction to Functional Reactive ProgrammingLet it Flow - Introduction to Functional Reactive Programming
Let it Flow - Introduction to Functional Reactive ProgrammingArtur Skowroński
 
Scala Functional Patterns
Scala Functional PatternsScala Functional Patterns
Scala Functional Patternsleague
 
Dip into Coroutines - KTUG Munich 202303
Dip into Coroutines - KTUG Munich 202303Dip into Coroutines - KTUG Munich 202303
Dip into Coroutines - KTUG Munich 202303Alex Semin
 
Swift 5.1 Language Guide Notes.pdf
Swift 5.1 Language Guide Notes.pdfSwift 5.1 Language Guide Notes.pdf
Swift 5.1 Language Guide Notes.pdfJkPoppy
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to SwiftGiordano Scalzo
 
Vuexと入力フォーム
Vuexと入力フォームVuexと入力フォーム
Vuexと入力フォームJoe_noh
 

Similar to Effector: we need to go deeper (20)

Swift 함수 커링 사용하기
Swift 함수 커링 사용하기Swift 함수 커링 사용하기
Swift 함수 커링 사용하기
 
Kotlin collections
Kotlin collectionsKotlin collections
Kotlin collections
 
The Essence of the Iterator Pattern
The Essence of the Iterator PatternThe Essence of the Iterator Pattern
The Essence of the Iterator Pattern
 
Implementing Software Machines in C and Go
Implementing Software Machines in C and GoImplementing Software Machines in C and Go
Implementing Software Machines in C and Go
 
The Essence of the Iterator Pattern (pdf)
The Essence of the Iterator Pattern (pdf)The Essence of the Iterator Pattern (pdf)
The Essence of the Iterator Pattern (pdf)
 
Go Beast Mode with Realtime Reactive Interfaces in Angular 2 and Firebase
Go Beast Mode with Realtime Reactive Interfaces in Angular 2 and FirebaseGo Beast Mode with Realtime Reactive Interfaces in Angular 2 and Firebase
Go Beast Mode with Realtime Reactive Interfaces in Angular 2 and Firebase
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdf
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React Alicante
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6
 
関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)
 
VTU Data Structures Lab Manual
VTU Data Structures Lab ManualVTU Data Structures Lab Manual
VTU Data Structures Lab Manual
 
Watch out: Observables are here to stay
Watch out: Observables are here to stayWatch out: Observables are here to stay
Watch out: Observables are here to stay
 
Let it Flow - Introduction to Functional Reactive Programming
Let it Flow - Introduction to Functional Reactive ProgrammingLet it Flow - Introduction to Functional Reactive Programming
Let it Flow - Introduction to Functional Reactive Programming
 
Scala Functional Patterns
Scala Functional PatternsScala Functional Patterns
Scala Functional Patterns
 
Dip into Coroutines - KTUG Munich 202303
Dip into Coroutines - KTUG Munich 202303Dip into Coroutines - KTUG Munich 202303
Dip into Coroutines - KTUG Munich 202303
 
Swift 5.1 Language Guide Notes.pdf
Swift 5.1 Language Guide Notes.pdfSwift 5.1 Language Guide Notes.pdf
Swift 5.1 Language Guide Notes.pdf
 
Pooya Khaloo Presentation on IWMC 2015
Pooya Khaloo Presentation on IWMC 2015Pooya Khaloo Presentation on IWMC 2015
Pooya Khaloo Presentation on IWMC 2015
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to Swift
 
Oh Composable World!
Oh Composable World!Oh Composable World!
Oh Composable World!
 
Vuexと入力フォーム
Vuexと入力フォームVuexと入力フォーム
Vuexと入力フォーム
 

Recently uploaded

Top Software Development Trends in 2024
Top Software Development Trends in  2024Top Software Development Trends in  2024
Top Software Development Trends in 2024Mind IT Systems
 
Kawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in TrivandrumKawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in TrivandrumKawika Technologies
 
ERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptxERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptxAutus Cyber Tech
 
Watermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security ChallengesWatermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security ChallengesShyamsundar Das
 
JS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AIJS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AIIvo Andreev
 
eAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspectionseAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspectionsNirav Modi
 
Generative AI for Cybersecurity - EC-Council
Generative AI for Cybersecurity - EC-CouncilGenerative AI for Cybersecurity - EC-Council
Generative AI for Cybersecurity - EC-CouncilVICTOR MAESTRE RAMIREZ
 
IA Generativa y Grafos de Neo4j: RAG time
IA Generativa y Grafos de Neo4j: RAG timeIA Generativa y Grafos de Neo4j: RAG time
IA Generativa y Grafos de Neo4j: RAG timeNeo4j
 
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdfARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdfTobias Schneck
 
Deep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - DatacampDeep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - DatacampVICTOR MAESTRE RAMIREZ
 
Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...
Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...
Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...OnePlan Solutions
 
Enterprise Document Management System - Qualityze Inc
Enterprise Document Management System - Qualityze IncEnterprise Document Management System - Qualityze Inc
Enterprise Document Management System - Qualityze Incrobinwilliams8624
 
Sales Territory Management: A Definitive Guide to Expand Sales Coverage
Sales Territory Management: A Definitive Guide to Expand Sales CoverageSales Territory Management: A Definitive Guide to Expand Sales Coverage
Sales Territory Management: A Definitive Guide to Expand Sales CoverageDista
 
Cybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and BadCybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and BadIvo Andreev
 
How Does the Epitome of Spyware Differ from Other Malicious Software?
How Does the Epitome of Spyware Differ from Other Malicious Software?How Does the Epitome of Spyware Differ from Other Malicious Software?
How Does the Epitome of Spyware Differ from Other Malicious Software?AmeliaSmith90
 
Why Choose Brain Inventory For Ecommerce Development.pdf
Why Choose Brain Inventory For Ecommerce Development.pdfWhy Choose Brain Inventory For Ecommerce Development.pdf
Why Choose Brain Inventory For Ecommerce Development.pdfBrain Inventory
 
Your Vision, Our Expertise: TECUNIQUE's Tailored Software Teams
Your Vision, Our Expertise: TECUNIQUE's Tailored Software TeamsYour Vision, Our Expertise: TECUNIQUE's Tailored Software Teams
Your Vision, Our Expertise: TECUNIQUE's Tailored Software TeamsJaydeep Chhasatia
 
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...Jaydeep Chhasatia
 
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/MLBig Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/MLAlluxio, Inc.
 

Recently uploaded (20)

Top Software Development Trends in 2024
Top Software Development Trends in  2024Top Software Development Trends in  2024
Top Software Development Trends in 2024
 
Kawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in TrivandrumKawika Technologies pvt ltd Software Development Company in Trivandrum
Kawika Technologies pvt ltd Software Development Company in Trivandrum
 
ERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptxERP For Electrical and Electronics manufecturing.pptx
ERP For Electrical and Electronics manufecturing.pptx
 
Watermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security ChallengesWatermarking in Source Code: Applications and Security Challenges
Watermarking in Source Code: Applications and Security Challenges
 
JS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AIJS-Experts - Cybersecurity for Generative AI
JS-Experts - Cybersecurity for Generative AI
 
eAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspectionseAuditor Audits & Inspections - conduct field inspections
eAuditor Audits & Inspections - conduct field inspections
 
Generative AI for Cybersecurity - EC-Council
Generative AI for Cybersecurity - EC-CouncilGenerative AI for Cybersecurity - EC-Council
Generative AI for Cybersecurity - EC-Council
 
IA Generativa y Grafos de Neo4j: RAG time
IA Generativa y Grafos de Neo4j: RAG timeIA Generativa y Grafos de Neo4j: RAG time
IA Generativa y Grafos de Neo4j: RAG time
 
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdfARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
ARM Talk @ Rejekts - Will ARM be the new Mainstream in our Data Centers_.pdf
 
Deep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - DatacampDeep Learning for Images with PyTorch - Datacamp
Deep Learning for Images with PyTorch - Datacamp
 
Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...
Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...
Transforming PMO Success with AI - Discover OnePlan Strategic Portfolio Work ...
 
Enterprise Document Management System - Qualityze Inc
Enterprise Document Management System - Qualityze IncEnterprise Document Management System - Qualityze Inc
Enterprise Document Management System - Qualityze Inc
 
Sales Territory Management: A Definitive Guide to Expand Sales Coverage
Sales Territory Management: A Definitive Guide to Expand Sales CoverageSales Territory Management: A Definitive Guide to Expand Sales Coverage
Sales Territory Management: A Definitive Guide to Expand Sales Coverage
 
Salesforce AI Associate Certification.pptx
Salesforce AI Associate Certification.pptxSalesforce AI Associate Certification.pptx
Salesforce AI Associate Certification.pptx
 
Cybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and BadCybersecurity Challenges with Generative AI - for Good and Bad
Cybersecurity Challenges with Generative AI - for Good and Bad
 
How Does the Epitome of Spyware Differ from Other Malicious Software?
How Does the Epitome of Spyware Differ from Other Malicious Software?How Does the Epitome of Spyware Differ from Other Malicious Software?
How Does the Epitome of Spyware Differ from Other Malicious Software?
 
Why Choose Brain Inventory For Ecommerce Development.pdf
Why Choose Brain Inventory For Ecommerce Development.pdfWhy Choose Brain Inventory For Ecommerce Development.pdf
Why Choose Brain Inventory For Ecommerce Development.pdf
 
Your Vision, Our Expertise: TECUNIQUE's Tailored Software Teams
Your Vision, Our Expertise: TECUNIQUE's Tailored Software TeamsYour Vision, Our Expertise: TECUNIQUE's Tailored Software Teams
Your Vision, Our Expertise: TECUNIQUE's Tailored Software Teams
 
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
Optimizing Business Potential: A Guide to Outsourcing Engineering Services in...
 
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/MLBig Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
Big Data Bellevue Meetup | Enhancing Python Data Loading in the Cloud for AI/ML
 

Effector: we need to go deeper