everything is composable (victor martins)
TRANSCRIPT
![Page 1: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/1.jpg)
Everything is composable
![Page 2: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/2.jpg)
Hello!I am Victor Igor
You can find me at @victorvoid
![Page 3: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/3.jpg)
1.Programming paradigms
A “new” perspective on modeling the flow of your software.
![Page 4: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/4.jpg)
“Na prática, cada paradigma vem com a sua própria maneira de pensar, e há problemas para os quais é a melhor abordagem.
![Page 5: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/5.jpg)
Programming paradigms
◍ Functional programming◍ Object-oriented programming◍ Logic programming◍ Symbolic programming
![Page 6: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/6.jpg)
Composability The essence of software development is composition.
![Page 7: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/7.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
![Page 8: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/8.jpg)
Composability
const doin_Thangs = str => _.chain(str) .words() .groupBy(s => s.length) .orderBy(x => x.length) .take(2) .flatten() .value()
![Page 9: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/9.jpg)
Composability
const reactiveUpInHere = el => fromEvent(el, 'keyup') .map(e => e.target.value) .filter(text => text.length > 2) .throttle(500) .distinctUntilChanged()
![Page 10: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/10.jpg)
Composability
(->> (range 1000000000000000000) (filter even?) (map inc) (take 5) (partition 2 1)) ;;=> ((1 3) (3 5) (5 7) (7 9))
![Page 11: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/11.jpg)
Composability
player.unitWithinRange(2).where(UnitIs.Enemy).where(UnitIs.Tank).DoDamage(5)
![Page 12: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/12.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
![Page 13: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/13.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
‘Victor and Igor’
![Page 14: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/14.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
‘victor and igor’
![Page 15: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/15.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
[‘victor’,‘and’,‘igor’]
![Page 16: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/16.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
[‘victor’,‘and’,‘igor’]
![Page 17: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/17.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
[‘igor’,‘and’,‘victor’]
![Page 18: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/18.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
[‘igor’,‘victor’]
![Page 19: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/19.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
‘igorvictor’
![Page 20: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/20.jpg)
Composability
const doThing = str => { const lower = str.toLowerCase() const words = lower.split(' ') words.reverse() for(let i in words) { words[i] = words[i].trim() } let keepers = [] for(let i in words) { if(words[i].length > 3) { keepers.push(words[i]) } } return keepers.join('')}
![Page 21: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/21.jpg)
Composability
const doThing = str => { const lower = str.toLowerCase() const words = lower.split(' ') words.reverse() for(let i in words) { words[i] = words[i].trim() } let keepers = [] for(let i in words) { if(words[i].length > 3) { keepers.push(words[i]) } } return keepers.join('')}
![Page 22: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/22.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
![Page 23: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/23.jpg)
Composability
![Page 24: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/24.jpg)
Composability
“O maior contribuinte de complexidade em muitos sistemas é o tratamento do estado e
o peso que isso acrescenta ao tentar analisar um sistema.”
Ben Moseley & Peter MarksOut of the Pit 2006
![Page 25: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/25.jpg)
Control flow
Composability
![Page 26: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/26.jpg)
Composability
Code volume
![Page 27: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/27.jpg)
Composability
![Page 28: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/28.jpg)
Composability
![Page 29: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/29.jpg)
Composability
![Page 30: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/30.jpg)
Composability
const dotChainy = str =>str .toLowerCase() .split(' ') .map(c => c.trim()) .reverse() .filter(x => x.length > 3) .join('')
![Page 31: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/31.jpg)
![Page 32: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/32.jpg)
![Page 33: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/33.jpg)
Programming !== Math
Programming !== Math
![Page 34: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/34.jpg)
Programming !== Math
try { return f(x)} catch(e) { console.error(e)}
![Page 35: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/35.jpg)
Programming !== Math
if { return f()} else(e) { return y}
![Page 36: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/36.jpg)
Programming !== Math
let stuff = [1, 2, 3]stuff = [1, 2]
![Page 37: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/37.jpg)
Programming !== Math
let stuff.splice(0, 2) stuff.pop()
![Page 38: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/38.jpg)
Programming !== Math
for(let thing in things) { if(thing.amount > 100) keepers.push(thing.name)}
for (i = 0; i < cars.length; i++) { text += cars[i] + "<br>";}
while (i < 10) { text += "The number is " + i; i++;}
![Page 39: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/39.jpg)
Assignment
CallbacksLoops
Side EffectsBranching
Errors
![Page 40: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/40.jpg)
Programming !== Math
Programming !== Math
![Page 41: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/41.jpg)
Programming != Math
Programming !== Math
![Page 42: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/42.jpg)
f.g
Programming !== Math
![Page 43: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/43.jpg)
f.g = x => f(g(x))
Programming !== Math
![Page 44: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/44.jpg)
str.toUpperCase().trim()
Programming !== Math
trim(toUpperCase(str))
![Page 45: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/45.jpg)
Category theory
![Page 46: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/46.jpg)
Category Theory
What’s category theory?
![Page 47: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/47.jpg)
What’s category theory?
Category Theory
Categories represent abstraction of other mathematical concepts.
![Page 48: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/48.jpg)
A mudança de paradigma provocada pela teoria da relatividade de Einstein trouxe a constatação de que não há uma perspectiva única para ver o mundo.
![Page 49: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/49.jpg)
Category
Category Theory
objects
![Page 50: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/50.jpg)
Category
Category Theory
objects
Arrows or morphisms
![Page 51: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/51.jpg)
Category
Category Theory
objects
Arrows or morphisms
Domain
dom(f) f
![Page 52: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/52.jpg)
Category
Category Theory
objects
Arrows or morphisms
Domain/codomain
dom(f) f
cod(f)
![Page 53: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/53.jpg)
Category
Category Theory
objects
Arrows or morphisms
Domain/codomain
dom(f)
g
cod(f)
![Page 54: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/54.jpg)
Category
Category Theory
objects
Arrows or morphisms
Domain/codomain
f
Composition
h
![Page 55: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/55.jpg)
Category
Category Theory
objects
Arrows or morphisms
Domain/codomain
f
Composition
hh . f
![Page 56: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/56.jpg)
Category
Category Theory
objects
Arrows or morphisms
Domain/codomainCompositionIdentity
![Page 57: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/57.jpg)
World Wide Web
Category Theory
![Page 58: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/58.jpg)
World Wide Web
Category Theory
objects = webpages
Arrows = hyperlinks
![Page 59: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/59.jpg)
World Wide Web
Category Theory
objects = webpages
Arrows = hyperlinks
Composition = Links don’t composeIdentity
![Page 60: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/60.jpg)
World Wide Web
Category Theory
objects = nodes
Arrows = edges
Composition = Edges don’t composeIdentity
Graphs
![Page 61: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/61.jpg)
Category Theory
objects = sets (or types)
Arrows = functions
Composition = function compositionIdentity = identity function
Programming
![Page 62: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/62.jpg)
Functors
Category Theory
![Page 63: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/63.jpg)
Category Theory
Functors map between categories
Functors
![Page 64: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/64.jpg)
Category Theory
A BCategory Category
FunctorF
![Page 65: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/65.jpg)
Category Theory
Composition Law
F(g ∘ f) = F(g) ∘ F(f)Identity Law
F(idA) = idF(A)
Functors laws
![Page 66: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/66.jpg)
Category Theory
“Hey, I know what can be mapped over. An array can be mapped over — you can map a function over an array!”
![Page 67: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/67.jpg)
Category Theory
Identity
const f = [1,2,3]f.map(x => x) //[1,2,3]
![Page 68: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/68.jpg)
Category Theory
Composition
[1,2,3].map(x => f(g(x)))
= [1,2,3].map(g).map(f)
![Page 69: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/69.jpg)
Composability
const nextCharForNumberString = str => { const trimmed = str.trim() const number = parseInt(trimmed) const nextNumber = number + 1 return String.fromCharCode(nextNumber)}
nextCharForNumberString(' 70 ') //'G'
![Page 70: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/70.jpg)
Composability
const nextCharForNumberString = str => return [str.trim()]
.map(trimmed => new Number(trimmed)) .map(number => number + 1) .map(n => String.fromCharCode(n))
nextCharForNumberString(' 70') //['G']
![Page 71: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/71.jpg)
Category Theory
Build your own Functor
![Page 72: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/72.jpg)
Composability
const Box = x => ({ map: f => Box(f(x))})
![Page 73: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/73.jpg)
const Box = x => ({ map: f => Box(f(x))})
const nextCharForNumberString = str => return Box(str.trim())
.map(trimmed => new Number(trimmed)) .map(number => number + 1) .map(n => String.fromCharCode(n))
nextCharForNumberString(' 70') //Box('G')
![Page 74: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/74.jpg)
const Box = x => ({ map: f => Box(f(x)), fold: f => f(x)})const nextCharForNumberString = str => return Box(str.trim())
.map(trimmed => new Number(trimmed)) .map(number => number + 1) .fold(n => String.fromCharCode(n))
nextCharForNumberString(' 70') //'G'
![Page 75: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/75.jpg)
Assignment
CallbacksLoops
Side EffectsBranching
Errors
![Page 76: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/76.jpg)
Loops
![Page 77: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/77.jpg)
filtermap
reduce
![Page 78: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/78.jpg)
Assignment
CallbacksLoops
Side EffectsBranching
Errors
![Page 79: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/79.jpg)
CallbacksSide effects
![Page 80: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/80.jpg)
Promise(5).then(five => five + 2)//Promise(7)
Promise(5).then(five => Promise(five + 2))//Promise(7)
Promise(5).map(five => five + 2))//Promise(7)
![Page 81: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/81.jpg)
const doThing = () => fs.readFile('file.json', 'utf-8', (err, data) => { if(err) throw err const newdata = data.replace(/8/g, '6') fs.writeFile('file2.json', newdata, (err, _) => { if(err) throw err console.log('success!') } }
![Page 82: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/82.jpg)
const readFile = futurize(fs.readFile)const writeFile = futurize(fs.writefile)
const doThing = () => readFile('file.json') .map(data => data.replace('/8/g', '6') .chain(replaced => writeFile('file2.json', replaced))
![Page 83: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/83.jpg)
const readFile = futurize(fs.readFile)const writeFile = futurize(fs.writefile)
const doThing = () => readFile('file.json') .map(data => data.replace('/8/g', '6') .chain(replaced => writeFile('file2.json', replaced))
doThing().fork(e => console.log(e), r => console.log('success'))
![Page 84: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/84.jpg)
const lib = username => getTweets(username) .map(tweets => truncateTo130(tweets)) .chain(tweets => writeFile('tweets.json', tweets))
lib('@victorvoid').chain(f => saveToS3(f)).fork(e => console.error(e), r => console.log(r))
![Page 85: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/85.jpg)
Assignment
CallbacksLoops
Side EffectsBranching
Errors
![Page 86: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/86.jpg)
ErrorsBranching
![Page 87: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/87.jpg)
Either
data Either a b = Left a | Right b
![Page 88: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/88.jpg)
Left('no loaded').fold(() => 'uow, error!', s => s.toUpperCase())//'uow, error!'
Right('loaded').fold(() => 'uow, error!', s => s.toUpperCase())//'LOADED'
![Page 89: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/89.jpg)
LeftOrRight('no loaded') .fold(() => 'uow, error!', s => s.toUpperCase())
![Page 90: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/90.jpg)
Right(2) .map(x => x + 4) .map(x => x / 2) .fold(() => 'uow, error!', r => r + 1)//4
![Page 91: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/91.jpg)
Left('ignored') .map(x => x + 4) .map(x => x / 2) .fold(() => 'uow, error!', r => r + 1)//'uow, error!'
![Page 92: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/92.jpg)
const getConfig = () => { try { return fs.readFileSync('config.json') } catch (e) { return null }}const getPort = () => { const str = getConfig() if(str) { const parsed = JSON.parse(str)
return parsed.port } else (e) { return 3000 }}
![Page 93: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/93.jpg)
const getConfig = () => Either.try(fs.readFileSync)('config.json')
const getPort = () => getConfig() .map(JSON.parse) .fold(e => 3000, c => c.port)
![Page 94: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/94.jpg)
const getThing = user => { const address = user.address if(address){ const zip = address.match(/(\d{5})$/i) if(zip){ const city = cityByZip(zip) if(city){ return city } else { return 'cant find city' } } } return 'cant find city'}
![Page 95: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/95.jpg)
const getThing = user => fromNullable(user.address) .chain(a => fromNullable(a.match(/(\d{5})$/i))) .chain(zip => fromNullable(cityByZip(zip))) .fold(() => 'cant find city', city => city)
![Page 96: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/96.jpg)
Assignment
CallbacksLoops
Side EffectsBranching
Errors
![Page 97: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/97.jpg)
![Page 98: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/98.jpg)
React example
Component :: a -> JSX
![Page 99: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/99.jpg)
a JSX bf g
![Page 100: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/100.jpg)
a JSX bf g
![Page 101: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/101.jpg)
a JSXfb
g
![Page 102: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/102.jpg)
const Comp = g => ({ fold: g, contramap: f => Comp(x => g(f(x)))})
![Page 103: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/103.jpg)
const Comp = g => ({ fold: g, contramap: f => Comp(x => g(f))})
const heading = str => <h1>You are viewing {str}</h1>
const Title = Comp(heading).contramap(s => s.pageName)
![Page 104: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/104.jpg)
const Comp = g => ({ fold: g, contramap: f => Comp(x => g(f))})
const heading = str => <h1>You are viewing {str}</h1>
const Title = Comp(heading).contramap(s => s.pageName)
Title.fold({ pageName: 'Home', currUser: {id: '123', name: 'Victor'}})//<h1>You are viewing Home</h1>
![Page 105: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/105.jpg)
Learn a new language
![Page 106: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/106.jpg)
Fantasy Land Specification
![Page 107: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/107.jpg)
![Page 108: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/108.jpg)
References- Mostly-adequate-guide- Professor-frisby-introduces-composable-functional-javascript- Ramda-fantasy- Functors, Applicatives, And Monads In Pictures- Bartosz Milewski - Category Theory for programmers
![Page 109: Everything is Composable (Victor Martins)](https://reader031.vdocuments.site/reader031/viewer/2022020411/5aaa32617f8b9a75178b462f/html5/thumbnails/109.jpg)
Thanks!Any questions?
You can find me at @victorvoid & victorvoid.me