►
Description
Kenneth will show how ClojureScript integrates with the Node & NPM ecosystem. We'll walk through a little example of rolling up tweetstorms and displaying it as one (hopefully) sensible blob of text.
Kenneth will show how ClojureScript integrates with the Node & NPM ecosystem. We'll walk through a little example of rolling up tweetstorms and displaying it as one (hopefully) sensible blob of text.
This talk was recorded at the Jozi.JS meetup group on the 19 April 2018.
https://www.meetup.com/Jozi-JS/events/246960071/
Disclaimer: The opinions in this talk are those of the individual and do not necessarily represent those of this channel, the meetup group, or it’s sponsors.
A
Thanks
a
run,
this
is
the
first
time
I'm
doing
this
one
and
it's
a
bit
not
my
usual
style,
so
it
will
go
very
well
and
then
there's
a
risk
that
the
wheels
might
come
off.
So
please
pay
with
me,
but
a
yeah
y'all
it.
Let
me
show
you
how
your
house
used
to
look
before
we
completely
screwed
it
up
so
first
off
a
bit
about
me
after
doing
a
lot
of
stuff
for
a
lot
of
years,
but
I
want
to
kind
of
gauge
like
I.
A
At
one
point
these
are
played
with
this
stuff
for
a
long
time,
I've
been
around
the
block.
I've
tried
a
lot
of
different
stuff
and
for
the
last
few
years,
I've
really
found
like
I,
find
something
really
really
decent.
Something
simple
something
nice
something
stupidly:
productive,
just
something
great,
and
it's
kind
of
been
my
mission
to
now
like
share
this
joy
and
happiness.
A
It's
a
bit
different,
so
be
with
me,
but
it
like
it's
also
something
worth
trying
and
I
must
say,
like
blue
can't
give
in
like
things
you
played
like
such
an
insane
amount
of
groundwork
that
I
never
even
thought
about.
So
let's
get
guy
who's
head
of
closure
script,
nice!
Okay,
that
saves
me
a
bunch
that
means
you've
heard
of
closure.
It
also
saves
me
a
bunch,
but
so
closure
is
a
lisp
it
this
guy
great,
that
it
fast
yeah.
A
That's
quite
like
a
interesting
thing
to
think
about
its
Lisp:
it's
not
the
oldest
programming
language,
but
we
got
the
if
statement
from
day
before
that
humans
were
the
if-statement.
They
looked
at
bet
data
and
decided
like
we're,
gonna
run
program,
ale,
we're
gonna,
run
program
B
and
because
you
think
of
like
algebra,
there
is
no.
If
and
this
guy
kind
of
made
it
happen.
B
A
But
what
I
want
to
show
you
is
even
within
the
closure
wall
this
this
closure
script
I
think
is
the
most
attractive
part
of
of
closure
beckons
or
everything
to
go
and
replace
and
rewrite
a
front
end,
conceptually
Lisa,
probably
more
would.
But
if
somebody
wants
to
like
apply
a
new
framework
or
and
bring
a
new
hammer
to
the
problem,
the
front
things
probably
were
they
going
to
start
so
and
within
the
closure
script?
Well,
there's
been
a
lot
of
activity
the
last
years
it's
been
crazy.
A
People
are
really
like
figuring
out
what
this
means
and
how
to
make
it
easier
for
people
to
get
on
board
because,
like
the
goats
hinted
towards
us
like
as
a
mind
shift,
that's
probably
the
biggest
thing.
We're
switching
into
functional
program
is
never
the
syntax
or
the
functions
like
it
that
met
it.
Like
it's
tough,
it's
simple,
it's
the
mind
shift,
that's
the
big
thing
to
get
across
and
having
nice
tools
that
eliminates
a
bunch
of
other
stuff
and
just
get
you
going
in
quickly.
A
Eases
that
mind
shift
so
I
want
to
show
off
shadow,
see
LJ's.
This
has
been
like
quietly
growing
up
in
the
clojurescript
world.
It's
like
four
years
old.
Already,
the
guy
who
built
this
had
like
a
great
focus
on.
How
can
we
get
closer
script
and
NPM?
Basically,
do
it
together,
seamlessly
closure
being
hosted.
Language
prides
itself
on
great
practical
interrupts.
It's
really
really
important.
It's
not
like
some
of
these
other
transport
languages
where
they
go
like
those
languages
over
there.
A
You
know
you've
got
to
do
a
bunch
of
effort
to
get
to
that
side
and
you've
got
I
remain
in
this,
like
very
pure
world.
That's
like
created
in
whichever
way
it's
super
pragmatic
you're
on
the
JVM.
You
need
that
JDBC
driver,
you
use
it
right
there
right
now.
You
need
that
weird
PDF
library
use
it
right
there
right
now
and
later
you
clean
it
up
same
on
the
JavaScript
side.
If
you
want
to
use
jQuery,
you
should
just
like
reach
out
to
dollar
and
go
I
mean
it's
it's
nice.
It
gets
you
going.
A
It
gets
you
moving
forward.
It's
something
I
personally,
don't
like
about
something
like
Elm,
which
puts
up
this
huge
barrier.
You've
got
to
use
this
port
interface
to
do
this,
darn
sits
we
building
stuff
and
we
want
to
get
stuff
done
this
their
clients.
It's
tight,
like
we've,
got
to
deliver
that
stuff's
important,
so
this
car
game
committed
from
another
angle,
and
it
works
really
really
well.
A
So
what
I
want
to
show
you
which
tend
not
to
be
non-trivial,
which
I'm
quite
happy
about,
is
unrolling
a
tweed
store,
I'm
sure,
everybody's
kind
of
familiar
with
what
a
a
tweet
storm
looks
like
I
also
want
to
use
as
much
of
in
beam
as
is
possible,
and
in
this
case
it's
really
impractical,
but
I
want
to
show
like
how
this
different
language
is
still
a
good
player
in
the
ecosystem
that
it
plays
it.
It's
not
trying
to
be
something
it
plays.
A
Ball
is
actually
and
as
far
as
I
exercise
you're
going
to
produce
a
single
JavaScript
artifact
that
you
can
just
take
out
and
use
anyway.
With
note
so
I
said
it
did
not
to
be
non-trivial.
When
you
get
a
tweet,
you
can't
actually
ask
Twitter
like,
what's
all
the
replies
to
this,
they
can
do
it
because
clearly
they
show
you.
This
but
you've
got
to
do
your
own
black
magic,
so
likely
a
tweet
storm
by
definition,
only
comes
from
the
author.
A
So
then
you
would
go
back
to
the
timeline
find
all
the
tweets
then
start
like
matching
up
based
on
the
replied
T
and
then,
as
you
find,
each
matching
one
you've
gotta
kind
of
like
change
the
one
you're
using
as
a
reference
and
walk
the
way
down.
So
it
turned
out
to
quite
be
nice
like
a
quite
a
list:
comprehension,
ish
problem
and
an
async
problem,
and
promises
are
involved.
So
it's
quite
nice.
A
So
that's
kind
of
like
the
idea
for
for
solving
this
problem,
but
first
I
need
to
show
you
some
closure
before
we
get
into
some
code.
So
I
was
quite
happy
with
a
lot
of
hands
that
went
up
so
we
can.
We
can
fly
through
these,
but
a
prefix
notation
functions
first,
so
the
operators
first
operands
come
after
a
lot
of
them
can
be
periodic
things
would
but
simple
examples
with
methods,
especially
nice,
because
you
never
ever
need
to
worry
again
about
like
like
operate
the
precedence,
because
your
brackets
define
the
presidency.
A
B
B
A
You
can
create
an
anonymous,
well,
create
anonymous
function,
assign
it
to
a
symbol,
and
then
you
can
use
the
symbol.
I
wouldn't
write
code.
If
you
had
to
do
it
that
way,
so
there's
some
short
end
to
help
us
out
looks
exactly
like
the
one
before
this
is
what
a
map
looks
like
so
very
much
like
a
plain
JavaScript
object.
Keys
values
can
be
nested.
You
can
go
in
and
read
your
stuff,
that's
how
you
a
short
end
for
getting
a
value
out.
A
Same
with
vectors
or
arrays,
quite
simple
to
just
pop
a
value
out,
these
are
indexed
very,
very
fast
and
simple.
To
use
first
taste
of
some
interrupts
because
you'll
be
seeing
snippets
like
this
scattered
everywhere,
but
basically
we're
going
like
base
a
dot
log
function
that
we
want
to
apply
to
the
J's.
So
J
slashes
are
number
one
breaking
into
the
JavaScript
world.
That's
I
interrupt
so,
and
the
console
is
our
friend
console
dot
log.
A
A
This
is
kinda
important,
because
everybody's
always
like
the
brackets,
the
brackets
70
brackets.
We
saw
a
comma
or
a
semicolon
or
any
other
special
reserved
word
or
anything
in
that
there's.
Nothing
just
because
it's
a
different
syntax
doesn't
make
it
more.
Syntax
makes
it
very
very
little
syntax,
I'm
a
rubyist
bar
today,
the
decade
of
Ruby
and
Ruby
suddenly
has
a
lot
of
syntax
to
me.
It's
bizarre.
This
thing
is
very,
very
little
syntax.
A
Its
functions
and
data-
it's
all
it
is,
and
from
that
simplicity
those
building
blocks,
come
something
spectacular,
but
it
comes
at
the
cost
of
a
bit
of
a
paradigm
shift.
So
back
to
our
problem.
We
need
to
get
it
to
eat.
We
need
to
try
the
time
line.
We
need
to
start
sifting
through
this
maze
to
reconstruct
so
serum
a
is
probably
the
queen
of
practical
tweets.
Ohms
I
think
she
abandoned
a
blog
for
this.
So
this
is
the
exact
kind
of
chain
we're
gonna
unpack
in
this
case.
A
A
A
A
A
B
B
A
A
It
kinda
need
to
hint
at
it
like
way
in
the
directory.
You'll
follow
the
line
you
want
some
dependencies,
so
these
are
not
necessarily
dependencies
that
you,
these
are
in
the
closure
side,
dev
dependencies
or
runtime
dependencies.
It
doesn't
matter
the
compiler
will
sort
out
what
you're
using
and
what
you're
not
using.
So
in
this
case,
this
is
all
development
stuff.
None
of
this
will
ship.
What
is
quite
nice
for
this
is
there.
Is
it
uses
the
package
JSON
for
your
normal
in
pain
packages?
A
You
just
yawn,
add
whatever
you
want
it's
in
node
modules,
and
you
start
using
it.
No
weird
aren't
as
long
as
it's
available
somewhere
in
the
classpath.
The
code
will
be
found
and
can
be
used,
and
that
is
fantastically
simple
in
this
case.
With
some
of
the
other
types
of
script
build
tools,
it's
a
bit
more
of
a
dance.
They
want.
You
to
be
more
explicit
about
what
you
depend
on,
so
they
can
end
up
producing
better
artifacts
and
a
better
experience
view
it's
way
more.
A
A
It's
just
you
want
to
target
a
node
script,
and
this
is
important
because
you
can
talk
like
an
old
library
if
you
want
to
make
it
an
NPM
module
or
you
can
talk
at
the
browser
if
you
just
want
normal
es5
and
you
would
just
tell
it
what
to
do
and
some
other
dev
tools.
This
is
not
particularly
interesting.
A
Very
very
short
and
sweet
I'd
really
really
opened
up
to
all
in
the
details
because
it
gets
more
interesting
somewhere
else,
but
this
is
basically
our
main
function
that
will
get
called.
It
accepts
a
variable
number
of
arguments.
That's
the
special
syntax,
don't
worry
about
it
too
much
but
Thaddeus.
We
want
to
give
it
a
URL
to
a
tweet
and
it
will
just
go
in
like
do
its
magic,
but
as
far
as
like
entering
as
a
CLI
point,
that's
all
we
want
this
thing
to
do
is
basically
get
the
tweet
ID
and
call
something
else.
A
So
you
think,
if
you
want
to
reuse
the
same
code
in
like
Express
handler,
you
would
do
the
same
thing
like
you're,
just
like
pause.
Either
you
get
the
tweet
or,
if
you'll
Express
environment,
and
you
would
gonna
call
the
same
thing
and
have
some
magic
happen
and
then
we
dive
in
and
we
unroll
our
tweet.
So
that
is
in
our
cool
friends.
A
Or
the
pipe
so
actually
I've
got
a
slightly
better
example
of
that,
so
I,
don't
wanna
I
liked
it,
but
it's
it's
quite
nice
and
then
also
allude
to
wireless.
If
they're
I
think
the
J
is
pipes,
index
is
a
bit
lacking.
So
if
you,
if
you
go
back
to
what
I
said
earlier,
the
way
we
express
our
problem
almost
by
wishful
thinking
is
we
want
to
be
able
to
say
like
we
want
to
get
the
tweet.
That's
our
starting
point.
We
want
to
get
the
author's
phone
line.
A
We
want
to
assemble
a
thread
from
that
time
line.
In
this
case.
We
kind
of
need
that
we
have.
This
funny
need
to
expand
the
tweets,
because
when
you
read
the
time
line,
all
the
tweets
are
truncated,
which
is
quite
pointless.
We
want
to
have
to
fool
things,
so
we
want
to
be
able
to
just
expand
them
all,
and
then
we
want
to
print
them
all
out.
So
what
this
threading
operator
does
here
is
very
much
like
the
pipeline.
A
This
is
the
normal
I
think
this
is
what
the
es
pipeline
is
coming
through
exactly
so,
we
start
over
this
function,
whatever
its
value
is
becomes
the
first
argument
to
this
function,
whatever
it
returns,
becomes
the
first
argument
to
the
next
one:
whatever
it
returns,
the
first
argument
to
the
next
one,
and
so
it
goes
there's
also-
and
this
is
the
my
thing
with
the
es
syntax
is.
If
you
look
right
above
here,
we
have
a
slightly
different
threading
operator.
This
one
pushes
everything
to
the
end.
A
A
Basically,
they
that's
what
happens,
but
the
threading
Opera
rewrites
our
code,
and
then
we
want
to
interpose
some
value
into
a
collection,
and
we
want
to
join
with
that
as
joining
our
string
and
we'll
have
a
collection
they
again
and
then,
ultimately,
it
pops
up
at
the
end
for
console.
So
we've
got
two
ways
of
threading
straight
first
and
thread
lost
and
there's
five
more
ways
depending
on
what
you
want.
A
It's
a
massive
toolbox,
there's
conditional
threat
first
conditional
threat
loss,
there's
an
S
trader
which
can
handle
like
any
kind
of
weird
mutation.
You've
got
if
you
want
to
string
some
stuff
together,
it
doesn't
work
and
if
you
have
this,
it's
a
fantastically
practical
toolbox
and
that's
why
I
like
it
looks
this
simple
pipe
first
and
the
es
thing
I'm
like
like
a
bit
this.
This
is
really
nice.
This
is
like
okay,
any
so
sprinkles
of
in
top,
this
is
kind
of
what
I
interact
like.
Sometimes
it
gets
a
bit
iffy.
A
This
is
an
entire
promise
chain
and
then
eventually
we
need
to
call
then
like
at
the
end
of
the
chain,
to
do
something
and
I
did
this
because
I
didn't
want
this
function
to
be
promised
away,
and
it
was
just
as
simple
as
that
and
I
wanted
to
kind
of
show
that
this
stuff's
possible.
It's
not
our
I.
Think
I
would
write
this
myself,
but
then
that's
okay.
A
So
let's
go
and
unpack
it
a
bit.
So
the
gate
tweet
basically
just
calls
a
function
in
a
different,
namespace,
namespaces
and
closures.
A
way
to
you
like
organize
your
code
and
the
way
to
think
about.
It
is
organize
the
code
by
the
problem
space,
not
necessarily
the
solution,
space
suspicions-
oh,
if
you
see
our
rails
Grails
or
anyone
other
these
frameworks
in
by
angular,
whatever,
like
you've
got
your
controllers
over.
They
like
it's.
The
solution
to
one
problem
goes
here:
models
is
a
solution
to
another.
Prop
your
solutions
get
bound
together.
A
A
So
in
a
closure
namespace
we
need
to
kind
of
require
external
dependencies
that
we
need
for
that
code
to
run
and
that
all
happens
as
part
of
the
namespace
definition.
More
specifically,
it
happens
in
this
require
block.
So
here's
a
few
things
going
on
the
first
is
that
Twitter
is
the
NPM
package.
That's
my
package,
so
JSON
actually
I
keep
saying
this,
but
they
start
with
the
gym
by
NPM
package
whoops
you
see
like,
but
this
basically
Yanks
in
Twitter
it
exports
one
function
and
I
want
to
get
a
handle
on
it.
This
good
object.
A
This
is
the
Google
closure.
Library
like
the
naming,
is
quite
crappy,
I,
don't
know
who
to
blame,
but
there's
like
the
ones
with
an
ace,
the
ones
with
the
J,
the
ones
language,
other
ones,
a
super
powerful
library
that
you
very
suddenly
use.
But
it
gives
you
a
great
bunch
of
stuff-
and
this
is
just
some
other
you
tools,
and
that
basically
means
that's.
Basically
I
made
a
little
function
that,
as
promised,
got
resolved
with
the
value,
but
I
just
wanted
something.
Nice
and
I.
Just
wanna
go
like
as
promised,
here's
your
value.
A
So
we
want
to
read
some
config
out
of
the
environment,
and
this
is
your
normal,
like
node
or
process
process,
that
in
V
dot
value,
I
just
thought
it
up
a
bit
and
I
just
went
like
I
want
to
get
off
J's
process.
The
env
key
I've
got
that
and
I
can
just
basically
go
and
read
now
the
values
off,
and
this
ends
up
looking
something
like.
A
A
Well,
we'll
get
it
we'll
get
it
going.
It
works
the
background.
I'll
show
you
I
mean
I'm,
not
in
my
normal
comfort
zone,
with
dueling
all
presentations
Darwin.
Yes,
it
with
the
function
we
called,
but
this
what
the
function
expects
a
JavaScript
object.
That's
what
it's
going
to
read
the
properties
from
we've
got
a
close
your
map,
full
of
keywords.
A
It's
like
a
machine
concert,
so
we
just
need
to
tell
closure
like
please
just
convert
that
clj
value
into
a
JavaScript
value
mm-hm
and
it
just
spits
out
a
normal
vanilla,
JavaScript
data
structure
and
you're
off
to
the
races,
normal
JavaScript
function,
with
normal
JavaScript
arguments
and
we've
got
a
Twitter
client
that
we
can
start
using
and
then
our
status
function
essentially
becomes
listen.
Here
we
want
a
client.
A
We
need
to
build
up
a
URL
based
on
the
tweet
ID.
We
want
to
make
some
extra
parameters
just
took
a
bit
to
figure
out
and
then
I
wanna
say
like
I
want
to
do
a
gate
request.
I
need
to
give
it
my
client
that
it's
gonna
do
the
request,
but
I
want
to
give
it
the
path
and
I'm
gonna,
give
it
the
parents,
and
then
yeah.
We've
got
another
piece
of
interrupts
again,
so
the
Twitter
client
gives
us
and
make
sure
you
map
this
over
to
what
section
the
documentation.
A
A
That's
clj
to
J's
on
the
map
basically
gave
us
out
this
JSON
object
and
we
catch
the
return
value
and
we
can
use
it
and
then
the
rest
of
the
API
is
essentially
cooling,
gatepost
or
stream,
with
whatever
the
twitter,
father's
the
parents
and
a
call
back
or
if
you
drop
the
call
back
it
turns
into
promises.
When
promises
are
available,
we
are
not-it's
all
happy.
So
that's
kind
of
what's
going
on
here
when
I
go,
I
want
to
call
the
gate
function
on
the
client.
So
this
is
interrupt.
A
That's
a
really
like
a
sign
that
we're
interrupting
with
something
else.
With
a
path
and
again,
we've
got
these
arguments
that
need
to
become
a
JavaScript
object
and
they
just
go
in
that
returns
a
promise.
The
promise
is
threaded
to
you
with
the
three
first
operated
two
every
year,
so
it
would
essentially
be
the
same
as
promise
like
that.
A
A
Think
for
the
first
time,
I,
like
in
two
years,
I've
found
a
good
use
case
for
this
and
it's
way
I.
Just
basically
imagine
if
you
got
a
function,
it
gets
an
argument.
It
tastes.
If
the
arguments
available,
if
it's
not
available
it
basically
calls
itself
again
with
a
resolved
promise
else.
The
function
goes
on,
assuming
that
it's
inside
the
vein,
so
you've
got
this
nice
thing
where
you
can
work
in
the
ripple
and
you
can
play
with
functions.
A
You
can
just
call
him
as
you
need
them
and
when
you
put
them
in
a
promise
chain,
they
keep
on
working
exactly
the
same
way
as
before
and
I
found.
This
was
quite
a
nice
like
way
to
just
make
this
custom
thing
called
Dave
thing,
so
cause
your
macros
or
functions
that
we're
doing
new
code
that
then
get
executed,
and
this
is
the
first
time
it
worked
to
me
that
I,
don't
wanna.
A
A
If
you
think
of
the
JavaScript
object
now
that
user
property
is
the
object
all
in
to
itself
with
all
its
properties,
and
so
this
basically
gives
us
like
tweet
dot,
user
dot,
user,
ID
string,
Oh,
ID
string
and
we've
got
that
and
then
we
can
basically
go.
I
could
be
needing
a
new
promise
because
we
need
all
the
tweets
since
that
one.
So
we
just
go
to
the
API
I'm,
not
gonna.
Have
that
functions
quite
simple:
it
does
exactly
like
the
user
status.
A
It
just
builds
up
its
parameter
slightly
different
and
then
so
we
get
this
promise
out.
Then
we
just
wait
for
the
promise
to
be
resolved
and
its
values,
our
timeline
of
the
user
and
then,
basically,
what
I'm
doing
they
some
taking
our
original
tweet
I'm,
putting
it
inside
the
vector.
So
it's
the
only
element
in
the
vector
and
I'm,
just
jamming
the
rest
of
the
tweets
in
there.
So
you've
got
this
array
where
the
head
of
the
array
is
our
starting
point.
A
It's
a
simple
semantic:
we've
got
it
so
later
we
can
always
just
go
like
we
start
at
the
front
off
the
list
and
we
simply
run
through
the
list
and
get
the
values
out.
It's
not
particularly
difficult
to
now
we're
gonna
get
to
something
interesting,
which
is
nice,
so
we've
now
been
through.
Okay,
so
we've
get
tweet
and
we
get
the
tweet
timeline.
So
at
this
stage
the
promise
that
gets
resolved
is
this
one
long
array
with
our
starting
tweet
and
all
the
race
on
is
one
simple
thing
now
to
assemble
it.
A
Same
thing,
we
pick
up
first,
one
wolf,
because
we
kind
of
need
it
like
it's
a
starting
point.
It's
a
ID.
We
need
to
start
finding
what
we
got
reply
to.
We
need
the
user
ID
in
this
context
as
well.
Now
we
want
to
make
a
short
list
of
tweets.
So
now
we
went
to
fetch
the
person's
entire
timeline,
even
though
they
busy
with
this
tweet
storm.
They
might
be
replying
in
between
two
other
people's
interesting
comments,
so
it
gets
a
bit
like
crazy.
A
So
you
might
want
to
sort
it
by
the
ID
as
well,
and
you've
got
now
ID
like
no
guarantees
that
Twitter
actually
gives
IDs
out
in
order
that
I've
got
a
super
complicated
distributed
system
just
for
giving
out
IDs
it's
a
bit
of
a
maze
cop.
This
video
systems
are
but
we're
just
want
to
go
like
sort
by
created,
and
we
only
want
the
ones
that
replied
to
the
original
user.
So
now
we
at
least
get
the
list
down
to
something,
and
then
we
can
start
assembling
our
tweet.
A
So,
let's
just
unpack
these
quickly,
because
I
quite
short,
so
by
creator
that
is
literally
sort
by
with
a
property
and
then
how
to
sort
say,
pull
like
what's
quite
nice
here,
and
this
is
kind
of
into
the
functions
as
first
law
citizens.
That's
key
to
functional
programming
is
that
is
the
function.
It's
not
a
special
symbol.
That
means
he
I
own.
A
A
you
can
go
put
any
other
function
in
there
when
the
create
that
add
value
comes
off
that
each
individual
tweet,
it
will
be
like
the
bellies
of
two
ones
where
we
pass
to
that
function
and
it
either
returns
true
or
false
or
the
whole
like
1,
0,
minus
1,
and
you
get
your
sorting
semantics
over
anything.
It's
really
powerful
and
it's
it's
quite
nice,
but
that's
the
function
itself,
not
some
special
key
word,
not
something
reserved
or
like
it's
it.
A
It's
a
function
and
yeah
I
wrote
out
two
examples
of
and
years
like
our
first
example
of
composing
functions
in
closure.
But
let's
look
at
this
one
folder
does
exactly
that.
You
give
it
a
predicate
functional
action.
Every
time
the
predicate
returns.
True,
the
value
survives.
It
will
like
come
out
on
the
other
side.
If
it
doesn't
it's
false
and
it's
as
in
this
case
we
go,
we've
got
a
user
ID
and
the
user
ID
is
getting
checked
inside.
That's
how
equality
takes.
So
that's
our
Equality
check.
A
That's
not
an
assignment
operator
now,
like
double
equals
or
triple
equals,
or
something
it's
like.
So
this
thing
this
thing
yes
or
no,
it's
quite
nice
and
in
in
reply
to
user
ID,
so
it's
a
property
on
the
tweet,
so
we
can
basically
go
like
if
one
is
one
like
yes,
this
one
survives.
If
they
reply
to
somebody
else,
we
kick
it
all
out.
A
A
Earlier,
in
that
example,
I
showed
like
oh
we've
got
this
map,
a
is
1,
B
is
whatever
now
basically
we'd
like
to
get
the
value.
Art
was
:
a
in
my
map
and
we
got
a
value.
That's
as
if
we
apply
the
function
to
the
map,
it
can
work
that
play
it's
a
beautiful
little
short
act.
So
in
this
case
the
first
week
comes
in
and
we
say
we're
going
to
apply
the
function.
In
reply
to
user
ID
string
on
you're
going
to
get
a
value
out,
then
the
second
wants
another.
A
Like
the
guy
said
like
we
work
it
from
right
to
left.
The
second
thing
is
we're
going
to
now
take
that
value
seats.
This
is
shorthand
for
creating
a
sate
when
you
use
hash
in
the
curly
braces
around
something.
Sates
are
functions
of
themselves
or
of
their
members.
So
now
you
can
basically
go
I've
got
a
set
of
one.
A
A
Uhh
I'll
see
if
I
can
get
it
connected,
show
you
how
it
works
and
you
okay.
So
what?
What
did
we
do?
Yes,
at
this
stage,
when
our
single
threads
got
cold,
we
had
one
huge
list
of
all
our
tweets,
including
our
starting
point.
We
made
a
short
list
which,
at
this
stage,
is
basically
they
just
order
it
by
date,
and
it's
only
the
person
replying
to
themselves.
A
We've
got
no
guarantee
yet
that
it's
actually
part
of
our
tweet
storm
that
we
unrolling
and
then
like
one
of
my
favorite
functions
and
one
of
the
most
powerful
functions.
I
guess
in
functional
programming
period
is
reduced,
goose
played
with
reduce
in
any
way
shape
or
form
in
any
language.
Yeah,
okay,
cool,
that's
great
like
as
like
sweet.
So
basically
we
end
up
our
first
arguments
are
reducing
function.
A
We
need
to
start
at
accumulator
with
something,
so
we
just
want
to
say,
like
I'm
gonna
start
with
our
starting
to
eat,
and
then
we
give
it
a
short
list
now
our
reducing
function,
basically
from
this
case
gets
called
with.
This
is
our
thread
so
the
first
time
it
gets
cold.
It's
only
our
starting
tweet
and
this,
and
that
tweet
in
this
case
is
actually
the
starting
tweet
as
well,
so
the
first
ones
are
now
up.
It
will
just
run
through.
A
But
if
you
think
about
that,
the
second
iteration
on
here
is,
we
will
be
able
to
look
back
at
our
accumulated
straight
and
we
get
like
I
just
want
the
last
one.
I
just
want
to
check
if
this
new
one
I
got
this
and
reply
to
that
one
and
we're
hoping
it's
kind
of
true
like
ice,
is
very
wishful
thinking.
A
There
are
earlier
salting
like
got
old
chronology
right,
because
if
something's
out
of
whack
will
miss
it
and
our
thread
will
be
broken
so
very
optimistic
thinking
and
then
basically
like
it
boils
down
to
if
they,
if
our
previous
ID
matches
our
in
reply
to
on
the
current
one,
we
just
want
to
conjoin
it
on
the
three:
it's
basically
a
painted
to
our
thread
list.
Otherwise
we
just
give
our
thread
back
should
have
mentioned
earlier
closures
of
implicit
returns
so
that
explicit
return
inside
the
debugging
functions.
All
of
that
is
gone.
A
The
last
value
is
always
the
one
that
propagates
up
and
in
an
if
statement
in
this
case
three
it
will
just
pop
out
it
becomes
on
your
accumulator
and
we
go
through
every
one
in
the
list.
This
morning,
I
add
like
a
loop
that
wouldn't
have
fit
it
on
the
screen
and
was
quite
nice
to
actually
do
the
problem,
a
part
of
it
and
break
it
down
into
a
ton
of
functions
and
be
dope.
Oh
yeah,
so
that's
kind
of
a
sorting
problem.
A
This
one
was
also
quite
happy
with
it:
they're
not
quite
meet
with
the
interrupter.
So
basically
so
now,
we've
got
our
thread,
but
Twitter
truncated,
our
values.
So
that
basically
means
now
we
need
to
go,
make
an
API
call
for
every
single
tweet,
because
we
want
the
full
text.
That's
essentially
what
you
want.
So
this
becomes
a
very
simple
map
function
with
an
anonymous
anonymous
map
function
and
they
do
provide
this
property,
whether
the
it's
been
truncated,
yes
or
no,
so
basically
go
if
it
has
been
truncated.
So
this
would
return
true
like
go.
A
Get
me
the
full
tweet,
otherwise,
just
resolve
a
promise
immediately
with
whatever
we've
got,
there's
no
need
to
go
out
over
the
network,
and
then
all
of
this
gets
pipe
to
promise
that
all
that
we
all
know
so
now
that
will
like
neatly
do
its
thing
and
give
us
anyone
out
and
then
that's
basically
the
expanding
pot,
and
then
we
finally
terminate
the
promise
with
the
print
aid
and
yeah.
Also
ain't
a
bit
bonkers
again
was
just
showing
off
the
interrupt
who's
used
chalk.
A
A
Just
so
we've
got
like
a
nice
line
between
everything
and
we
join
it
all
with
a
new
line
and
we
send
it
off
to
console
dot
log
and
we
are
done
what
that
ends
up
no
I
changed
networks,
yeah
yeah,
I'm,
gonna
sue
me
now.
This
is
not
exciting.
This
is
just
a
bull
tool,
but
that's
basically
it's
just
it's
just
running
through
yawn
yawn
shadow
ALJ's.
A
They
basically
gave
us
exactly
what
we
wanted,
but
what
I
yeah
I
knew
there
is
an
annual
tweets
tool,
but
what's
important
is
what
you're
seeing
younger
terminals
are
node
process
connected
to
a
separate
like
Java
process?
That's
busy
driving
out
all
the
stuff
all
day.
You
started
it
out
with.
We
started
it
out
with
yarn
and
then
in
our
ripple.
So
this
thing
should
have
died
now
that
it
is
kill
it
properly.
B
D
A
Stuff
I
needed.
Oh
that's,
not
connected
I,
wanted
to
show
this.
Ok,
the
networking
zippy.
This
thing
doesn't
want
to
connect.
It's
actually
something
I've
battled
with
the
tool.
If
you
switch
networks,
a
lot
like
I
can
I.
Do
you
need
to
tear
down
your
environment
to
bring
it
up
and
gonna
help
report
an
issue
but
yeah
when
I
could
get
the
ripple
to
connect
properly
and
do
the
work
as
you're
busy
working
with
the
functions
and
changing
code
and
saving
the
compiler
will
be
constantly
updating
the
code?
A
A
D
A
All
happening
too
much
yeah,
that's
kind
of
that,
but
and
sorry,
but
I
like
I'm,
feel
like
a
dragon.
I
just
want
to
show
you
one
last
thing
in
this
case
are
basically
compiled
out
a
different
compiled
target,
and
this
gave
us
like
a
bunch
of
optimized
JavaScript
that
we
can,
that
can
all
be
copied
and
ran
somewhere
else.
Where
the
other
bolt
the
separate
bolt
we've
got
with
the
dev
tooling,
is
quite
useless
on
its
own
there's,
nothing.
It
can
do,
but
it
specifically
they
for
going
through
the
development
loop.
A
So
this
is
the
kind
of
boring,
boring
JavaScript
that
closure
splits
out
for
us,
but
there's
everything
with
proper
node
stuff
in
between
it's
quite
a
beast.
This
way,
okay,
I'm
gonna,
try
this
Ivan,
so
you
guys
another
example:
it's
if
you
can
get
it
at
once,
compile
no
I
need
to
configure
it.
I'm,
not
gonna!
Do
it
if
you
use
the
advanced
compilation
mode
in
the
Google
closure
compiler,
so
the
Google
closure
compiler
is
a
key
underpinning
of
our
closure
script.
Work
and
this
thing
is
absolutely
amazing.
A
I
feel
like
Google,
has
been
so
much
work
in
this
compiler
building,
something
that
powers
all
the
way
properties
like
tree
shaking
is
now
becoming
a
big
thing
in
the
way
back
world
and
people
are
trying
to
solve
this
problem,
and
it's
all
probably
I'll.
Take
my
hat
off
to
anybody
who
are
like
I
wouldn't
want
to
tackle
that.
But
it's
been
in
the
Google
closure
compiler
for
like
a
decade.
A
A
But
if
you
start
shipping
big
bundles
to
a
browser
that
makes
all
of
a
difference
and
the
way
this
tooling
can
start
walking
up
the
chain
gives
you
something
super
powerful,
especially
if
you
start
thinking
well,
I've
got
closures
a
whole
language
that
I
need
to
shift
with,
like,
if
you
just
think
about
it,
that
can
become
super
AV,
but
now
the
way
the
closure
compiler
reaches
into
all
your
code.
It
will
only
pull
out
the
closure
functions.
All
the
JavaScript
versions
of
the
same
functions
as
you
need
it.
A
It's
got
facilities
for
hot
code,
migration,
which
I
think
is
something
at
the
wayback
world
hasn't
released.
I'm
struggling
still
to
wrap
my
der
and
you
can
tell
it
like
I've,
got
a
namespace
in
my
code
that
shade
between
all
my
different
artifacts
that
I'm
building
and
please
put
that
in
a
separate
library
for
me,
and
it
will
literally
rewrite
all
your
code
to
start
requiring
that
piece.
So
you
can
think
of
creating
like
a
vendor
bundle.
That's
got
all
your
like
extra
stuff
that
stuff
that
infrequently
changes
in
your
project.
B
B
A
So
it's
an
amazing
tool
chain
to
to
build
on
top
of
trying
to
be
respectful
via
Thomas
the
place
so
shadow
CL
Jase,
with
all
the
guys
I
actually
got
great
Doc's.
There's
a
few
holes
in
there
and
I'm
gonna
I
made
a
lot
of
notes.
I
think
we're
gonna,
try
and
and
help
their
closure
skip.
The
dog
also
recently,
with
the
1.10
release
of
clojurescript
paid
like
read
that
they
all
kick
Quick
Start
Guide
and
it's
it's
slick
now.
These
people
have
really
put
a
lot
of
thought
in
you
know.
A
I
would
recommend
that
really,
as
a
way
of
exploring
this
world,
like
I,
said
rewriting
a
back
ends,
never
gonna
happen.
It
works
with
any
editor.
You
can
think
of
Emacs.
If
you
know
it
the
best
way
to
get
going.
If
you
don't
pop
Emacs
for
next
year,
like
get
used
to
own
tools,
it's
too
big
a
shift,
but
this
cursor
for
IntelliJ.
You
saw
it
work
well,
but
mostly
working
at
them.
Now
it
worked
only
I
promise.
You
vs
codes
got
plugins,
there's
even
a
bunch
of
stuff
of
them.
A
I
used
to
be
a
them
user,
but
I
think
there's
like
a
mismatch
between
them's
modal
editing
in
this
kind
of
rich
experience,
but
all
the
other
ones
alright.
So
they
might
be
a
bit
of
friction,
I,
don't
think
it'll
be
as
smooth,
but
it
works
and
people
use
it
and
they
love
that
tool
and
they
get
stuff
done,
which
is
the
most
important
play
and
that's
my
story.
Thank
you.
B
D
D
A
Some
of
the
closure
guys
Rebecca
CH,
react
as
released
by
Facebook
the
production
bull
with
Google
closure
and
it
days
tool
shaped
like
20
percent
or
something
off
the
pelo
they're
just
dead
functions.
There's
something
I
didn't
show
you.
It
cuts
a
node
with
it
doesn't
do
it,
but
I
thought
about
it.
A
You
guys
said
like
putting
the
debugging
functions
in
your
pipelines
and
stuff.
One
of
the
amazing
things
with
closure,
with
Google
closure
and
in
closure
script.
Working
together
is
you
can,
literally
in
the
compiler,
can
figure
out
when
you've
got
date,
code
buffs.
So
when
you're
building
those
chains
of
functions,
you
can
have
debug
functions
in
between
the
depend
on
some
kind
of
boolean
flag,
but
not
like
a
normal
coat
like
a
compiler
kind
of
flag
and
we
do
a
production
bolt.
A
You
set
that
to
false
and
the
compiler
knows
it's
got
to
alight
the
code
properly
I
could
just
disappears
out
the
code
base,
so
is
even
even
like
remembering
the
one
console
dot
log
that
you
have
to
disable.
The
code
is
not
shipped
yeah
and
there's
a
lot
of
closure.
Libraries
that
depend
on
that.
Like
there's
some
profiling
tools,
your
profile
in
development,
but
you
never
profile
in
production.
Profiling
code
isn't
been
shipped.
If
you
use
trace
and
debug
log
statements,
you
can
tell
the
compiler
like
look.
B
B
A
B
A
As
with
all
functional
stuff
like
but
I
would
recommend
their
play
with
it,
this
is
something
and
I
wish.
Everybody
would
take
this
into
production
life's
a
lot
simpler
and
that's
it.
They
stole
something,
usually
valuable
in
playing
with
something
as
different
as
this
I
believe
it's
a
good
different,
but
it's
still
like
something
at
shakes
you
bit.
It
makes
you
like
look
at
code
differently.
It
makes
you
think
about
the
dangers
of
mutation.
A
Like
all
the
stuff,
like
I
mean
I,
just
closures,
dynamic
and
immutable,
like
nothing
I
had
they
could
changed
like
whenever
you
saw
the
value.
There
was
a
little
that
value
it
had
was
the
last
value
it
ever
had.
You
can't
go
in
like
fiddle
and
do
stuff.
It's
got
very
explicit,
like
pipes
or
when
you
need
mutation
and
it's
safe.
It's
like
ask
a
patch,
and
you
know
you
need
something
now
and
for
the
rest,
you
just
go.
A
If
you
like
it,
and
if
not
you
just
delete
it
like
there's,
no
real
things,
people
there's
something
that
comes
out
of
it.
It's
like
enriches
you
and
that
I
think
it's
like
I
push,
try
that
and
when
they
I
take
in
slack
we're
all
in
the
closure
channel
always
say
if
you've
got
any
questions,
you
can
more
hit
us
up
there
as
well
and
hanging
around
for
a
bit
as
well.
So
thanks,
thank
you.