git » homepage.git » commit 2827679

Preserve InfoQ presentations

author Alan Dipert
2026-08-09 20:34:36 UTC
committer Alan Dipert
2026-08-09 20:34:36 UTC
parent da50c978369a6f261c3372fa6b5f3222b1557538

Preserve InfoQ presentations

archive/techworks/SHA256SUMS +12 -0
archive/techworks/items/infoq-frp-javelin/audio.ffprobe.json +24 -0
archive/techworks/items/infoq-frp-javelin/source.headers +17 -0
archive/techworks/items/infoq-frp-javelin/source.html +2608 -0
archive/techworks/items/infoq-frp-javelin/video.ffprobe.json +32 -0
archive/techworks/items/infoq-programming-with-values/audio.ffprobe.json +24 -0
archive/techworks/items/infoq-programming-with-values/source.headers +17 -0
archive/techworks/items/infoq-programming-with-values/source.html +2592 -0
archive/techworks/items/infoq-programming-with-values/video.ffprobe.json +32 -0
archive/techworks/manifest.tsv +14 -2
md/TechWorks/media/audio/infoq-frp-javelin.mp3 +3 -0
md/TechWorks/media/audio/infoq-programming-with-values.mp3 +3 -0
md/TechWorks/media/video/infoq-frp-javelin.mp4 +3 -0
md/TechWorks/media/video/infoq-programming-with-values.mp4 +3 -0
md/TechWorksArchive.md +2 -0

diff --git a/archive/techworks/SHA256SUMS b/archive/techworks/SHA256SUMS
index b7cd598..3483a29 100644
--- a/archive/techworks/SHA256SUMS
+++ b/archive/techworks/SHA256SUMS
@@ -9,16 +9,20 @@
 1e876de98c65f221e3b437892e93a5c1ef911b023e85e78975769e015d95152e  md/TechWorks/media/video/tSw3x0rVh88.info.json
 1e9951de2d98335c45976f7dce0b5429469343eab20a5c17e5d3ed597f1fd7b4  md/TechWorks/2018-12-17-CommonLispOrangeCombinator.pdf
 2058ab1dd1f4ce00ad2dc7df9c5bab0bb2fec352de7264bafb4066cf92d67cd5  archive/techworks/items/cognicast/111-cover.jpg
+2119a64870a684d6f0e67527129948096aab553aa08da38503200ec85f11c11f  archive/techworks/items/infoq-programming-with-values/source.headers
 227727c95169600d4f300d37f76215997bb343697679baf2025f2340b016b9c3  archive/techworks/items/clojurestream-s4-e19/soundcloud-2020.headers
 23aa4b7e40ecb6f2cf4e3835ed2e0742361c247fc27b4b5c919ddf65215787e5  md/TechWorks/media/video/wVXjExRiFy0.jpg
 23d791b87ee82d998e6c8a01614555b475acc106e3b302f59600eae9380d127e  archive/techworks/items/clojurestream-s4-e19/soundcloud-cdn-cdx.json
 2451f37102f046afd1262e68006a28ea7c64cefa66e040f946e85947a42427b4  archive/techworks/items/clojurestream-s4-e19/artwork-replay.headers
+268c30cc7e1400e9e8b9d5d1b6d8e19cf53291de68b0adda0847bc0b09e50732  archive/techworks/items/infoq-programming-with-values/video.ffprobe.json
 295dcd7f2ea293bb9e3bb46417d787a934e739739a98bccf7031276c6366a280  md/TechWorks/ocrug-2018-11-27-71dd0b1.tar.gz
 2a2b25998617233beb48a5e213dc22fe80a561f0d576c625beeb34f9feae1c4d  md/TechWorks/media/video/HGuTqsVh59w.mp4
 2fa46c61ffce23593ef18c65bdeea96bff452d233c0b75f348709ee58f85a040  md/TechWorks/media/video/wVXjExRiFy0.info.json
 33b3861b8d5deeb4596682207f44dbe534bcea015f25849d53f5d696c9decfec  archive/techworks/items/cognicast/052.html
 348263dc01b3b86799759f5bcbfce0afe32726a675580a520ddc7a39ca868d83  archive/techworks/items/cognicast/112-cover.jpg
+3499a6da9bdce3dd105c4f8faf8bdcb7310f3bc64deb09096c8f5937518e40cc  archive/techworks/items/infoq-programming-with-values/source.html
 36efb38dd1f1fc8682b6f2e70e4ce21bad65e0b235bc236fb105d79911fd337b  md/TechWorks/barcamp2012-jsonscript-7e4dcf7.tar.gz
+37bd6847601d6bb5c25639fa100b9d0db33a3694679ea780761ab1c417249ccf  archive/techworks/items/infoq-frp-javelin/audio.ffprobe.json
 37eb2a8885fae16fc6f45b7910a272d9564246cf140ecd72db756fbdc3efa852  md/TechWorks/oscon2012-clojure-5ac233f.tar.gz
 380d401a5861632a524375c92f278598dda20a84fd51110a394e5b8e56c95726  archive/techworks/items/cognicast/112.html
 39071c475b53ebb55c213f4dbb0cc731b9f9da31f7afe5591afbe8f59cd80789  md/TechWorks/OCRUGInterview/headshot.jpg
@@ -46,6 +50,7 @@
 66326358232546ee1a467dc983d144d777d8f039f1b4377a140554fe3b527781  md/TechWorks/media/video/HGuTqsVh59w.en-orig.vtt
 66326358232546ee1a467dc983d144d777d8f039f1b4377a140554fe3b527781  md/TechWorks/media/video/HGuTqsVh59w.en.vtt
 718dea32362c630c4756f539298cddfdc7cb3f941ebd25e303c55e174edd5aa3  md/TechWorks/media/video/44Q9ew9JH_U.webp
+733ec4b8005a8be7d96d2ba7daf76263066c9d49c095a1fb6232e7638e4d6adc  md/TechWorks/media/video/infoq-programming-with-values.mp4
 7355773d7c4efd3beefc0b75481b20722d33b75c5fb13a2802850eb493a24837  archive/techworks/items/cognicast/052-cover.jpg
 73c7a51dec9b771029efe866ccdc013dfdd6807b98e64b853c85e91c2858fe41  archive/techworks/items/2005-netbsd-workstation/linux-com-live.headers
 746135f37df7aa246fa753ce0a39d2e7f347424ee65e26eb1ec4343a1d13addd  md/TechWorks/authored/wondr/posts/assertions-and-postconditions.html
@@ -60,6 +65,7 @@
 83272bbfc8c1576d7695152609e9bad5ca2441b563405aa6f6da5ba147b73b7e  md/TechWorks/authored/wondr/index.html
 87dca0f7c7702bd05c05bc865756d988ff845f10d6e2acb287fe6dcab9b9341e  archive/techworks/items/clojurestream-s4-e19/audio-replay.headers
 8bb253146b27ce8a8b08520b0064b0b34659b1460296ffcd69439c53a401ceab  md/TechWorks/authored/jlt/atom.xml
+8dad6ca17579e26ec0c9a1c09ef6a5d2e7a405bbd0f16e7d54f8e66c425c7909  archive/techworks/items/infoq-frp-javelin/video.ffprobe.json
 9156d187f09855a7d1d6fa026dec4956912ac1ce768edbefe721f6565a57f0ba  md/TechWorks/media/audio/clojurestream-s4-e19.mp3
 934c2bd9997b9e6603f28308b6fccf0a72d2e30c3bb422effbcf4224ee8d7282  md/TechWorks/gherkin-76dc034.tar.gz
 935c7f008b22184aa5f2c494c3b4f085adc4091e400fd616b31d57e23d5cc7ac  archive/techworks/items/2019-ocrug-interview/2019-original.html
@@ -69,6 +75,7 @@
 9b5d26799ed7c9f6d78240a10c09f934444d393e506323b6e2320459f8474533  md/TechWorks/OCRUGInterview.html
 9bdd689419033e4120dad5da97c5da162614f4c13528a49f6e3955d692fed341  md/TechWorks/MyWorkstationOSNetBSD.html
 9ffc964563d278119bf8a0feec54ab7cd41c1dbb1c4e0de058d7d370603cc0d3  md/TechWorks/media/video/44Q9ew9JH_U.info.json
+a14dc4ce3d83b1688b13575405f6b2d725d508fa1551d8ebd0b5a81a0b9de46a  md/TechWorks/media/video/infoq-frp-javelin.mp4
 a15dd034225897ddf87849d027c48c7d3ef0979b2bb17329172c5103e5b7e794  md/TechWorks/media/video/bmHTFo2Rf2w.en-orig.vtt
 a15dd034225897ddf87849d027c48c7d3ef0979b2bb17329172c5103e5b7e794  md/TechWorks/media/video/bmHTFo2Rf2w.en.vtt
 a36e25592798eb869f27aefea9fadaa00de5622ef5eb268edd335af69a03c36d  archive/techworks/items/cognicast/111.html
@@ -82,15 +89,19 @@ ac5b60c328ac78786f03d96cf889ec4b236f5f0b5aa984e5d318ff6c644cc044  archive/techwo
 ace070cf982b935b701a28b767194b82a59b2322986c065e7159aefdfab3dc58  md/TechWorks/media/audio/cognicast-052.mp3
 b329888a9c0e528192cb24eb4a5dd7644b0e0126d975a8329c5a49fe7b7c0e14  archive/techworks/items/2019-ocrug-interview/2022-replay.html
 b439b4b8993805b0163a467d8f18090e3044526ed7e50cd97bb5a32b09cbbc8a  md/TechWorks/media/video/HGuTqsVh59w.info.json
+b720141f594781805b58b0cf682a2aa6227d358df9b5ef27d1fd711737437ea9  archive/techworks/items/infoq-programming-with-values/audio.ffprobe.json
 c0b942c1ec79ed851fc8810fc224b3e357c01bce98f957bf63786f4e467a2ed8  md/TechWorks/media/video/TcnzB2tB-8Q.mp4
 c318fdba4c6c5caa69baefa238a7b6ecd94afefc8d2c8826a7931028d989fa51  md/TechWorks/media/video/bmHTFo2Rf2w.mp4
+c41eb86d39e4e8b46b3340d43b67ef62908132bb62cf81b8d8b66d6665ba5e55  md/TechWorks/media/audio/infoq-frp-javelin.mp3
 c44f5ca43719a56aa8b4146dac88674026912bef67d01f7f7661184cd0b470b9  archive/techworks/items/2019-ocrug-interview/timemap.json
 cbdb7e0a11b8566c73453ca401b7cc4ef9d2a424eff8d00dee4f1a6e435d89c3  md/TechWorks/media/SHA256SUMS
 cff200708de3e324faa0e5a7cd4fce4beaaa9100921c47ac4d81bcb698e151f6  md/TechWorks/media/audio/cognicast-112.mp3
 d04ff1f53296811517fd27fb2ed11b4092709558723c36d07f9719a9a4850ca4  md/TechWorks/media/video/bmHTFo2Rf2w.jpg
+d18e8f815f977dec70111afd99457a3f488f516df3e0ffd05015d52b9a8ef05d  archive/techworks/items/infoq-frp-javelin/source.headers
 d3bc604551b9f39837f4d619d8b61c324b95e6e26afed30a291092bc8d975d02  md/TechWorks/authored/wondr/posts/package-development-windows.html
 d7008a80eacfc904a8c51334564027aa12a579306f668685f3d9934c4ec3d4fc  archive/techworks/items/clojurestream-s4-e19/soundcloud-rss-2021.headers
 d82843df799752ff13fef3f75599bc683cf22ce5957590aa199a2bbbd018c315  md/TechWorks/authored/jlt/posts/collecting.html
+d977b0b3706d214f78878695dc9c7870d3ee78bc639f9f5b5774d051a8367df8  md/TechWorks/media/audio/infoq-programming-with-values.mp3
 d9feaebbf7dd5f8037be7b60226c1e773f304b479f331a2bea3c1a16338684d4  md/TechWorks/media/video/tSw3x0rVh88.en-orig.vtt
 d9feaebbf7dd5f8037be7b60226c1e773f304b479f331a2bea3c1a16338684d4  md/TechWorks/media/video/tSw3x0rVh88.en.vtt
 dbdf9ad5674803b9eb8537c17c7b8f2d4a97a00e9e2d83b6c614e1d91dc02643  archive/techworks/items/2019-ocrug-interview/2019-original.headers
@@ -101,6 +112,7 @@ e692d52425f09aa632a8c4605dbdb7674d515b20b662fff6fdf441a1f5e60dbf  archive/techwo
 ea6820d653957fcc86d231b37fab642418a9f8a8991003a30d2a4d70adbd6ce3  md/TechWorks/fast-shiny-da0ea10.tar.gz
 eb519fb5da6646d808dc1801803b3d8e35d5d90bf164775c10833cc43be9b340  md/TechWorks/authored/wondr/posts/shiny-inline-markdown.html
 ef306bbebe80ee481cf012cf446c563828d93902ee927b0a14dc86e60e7b5efc  md/TechWorks/authored/jlt/posts/collecting-macro-edition.html
+f413f0be7acdb4780a2698c2f1b363a5d656cb4b3635cd0352c30a4cd4f0be19  archive/techworks/items/infoq-frp-javelin/source.html
 f50e8de09c6a01a8ac8178eec634fb42151ecd83e9fa1de49ee76e862b8b0507  md/TechWorks/media/video/tSw3x0rVh88.jpg
 f878cc08851e69e0a757b86400729bbe6a3882e875a6330e4f178e58887e713a  archive/techworks/items/clojurestream-s4-e19/soundcloud-rss-cdx.json
 f93ac829f7ae73c768197eb4f47c634a38f123a1f7bacd3b4065927ac1c86c9a  md/TechWorks/media/video/44Q9ew9JH_U.mp4
diff --git a/archive/techworks/items/infoq-frp-javelin/audio.ffprobe.json b/archive/techworks/items/infoq-frp-javelin/audio.ffprobe.json
new file mode 100644
index 0000000..da9df1a
--- /dev/null
+++ b/archive/techworks/items/infoq-frp-javelin/audio.ffprobe.json
@@ -0,0 +1,24 @@
+{
+    "programs": [
+
+    ],
+    "stream_groups": [
+
+    ],
+    "streams": [
+        {
+            "index": 0,
+            "codec_name": "mp3",
+            "codec_type": "audio",
+            "sample_rate": "44100",
+            "channels": 2,
+            "r_frame_rate": "0/0"
+        }
+    ],
+    "format": {
+        "format_name": "mp3",
+        "duration": "2353.065938",
+        "size": "37650079",
+        "bit_rate": "128003"
+    }
+}
diff --git a/archive/techworks/items/infoq-frp-javelin/source.headers b/archive/techworks/items/infoq-frp-javelin/source.headers
new file mode 100644
index 0000000..fa1fc08
--- /dev/null
+++ b/archive/techworks/items/infoq-frp-javelin/source.headers
@@ -0,0 +1,17 @@
+HTTP/2 200 
+date: Sun, 09 Aug 2026 20:25:52 GMT
+content-type: text/html;charset=utf-8
+server: Apache
+sniply-options: BLOCK
+x-frame-options: DENY
+x-content-type-options: nosniff
+vary: Accept-Encoding,User-Agent
+content-encoding: gzip
+cache-control: private,no-cache,no-store,must-revalidate
+pragma: no-cache
+access-control-allow-credentials: true
+accept-ranges: none
+access-control-allow-origin: https://www.infoq.com
+x-xss-protection: 1; mode=block
+content-security-policy: frame-ancestors 'self'
+
diff --git a/archive/techworks/items/infoq-frp-javelin/source.html b/archive/techworks/items/infoq-frp-javelin/source.html
new file mode 100644
index 0000000..16dfa44
--- /dev/null
+++ b/archive/techworks/items/infoq-frp-javelin/source.html
@@ -0,0 +1,2608 @@
+<!DOCTYPE html>
+
+
+
+
+
+
+
+
+
+
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <!-- Google Optimize Anti-flicker snippet (recommended)  -->
+        <style>.async-hide { opacity: 0 !important} </style>
+        <style>.promo{background:#222528;position:fixed;z-index:1001!important;left:0;top:0;right:0;max-height:48px;min-height:48px;padding-top:0!important;padding-bottom:0!important}.promo,.promo p{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo p{font-size:.8125rem;line-height:1rem;color:#fff;margin-bottom:0;margin-top:0;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:700}@media only screen and (max-width:650px){.promo p{font-size:.6875rem}}.promo span{overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.promo a{color:#fff!important;text-decoration:underline!important}.promo a.btn{background:#d0021b;padding:7px 20px;text-decoration:none!important;font-weight:700;margin-left:10px;margin-right:10px;white-space:nowrap;border-radius:5px}@media only screen and (max-width:650px){.promo a.btn{font-size:.6875rem;padding:7px 10px}}.promo.container{padding-top:8px;padding-bottom:8px}@media only screen and (min-width:1050px){.promo.container{padding-top:0;padding-bottom:0}}.promo .actions{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.promo .actions__left{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo .actions__right{-ms-flex-preferred-size:40px;flex-basis:40px;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.promo.hidden{display:none}.promo.show{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.promo.show .container__inner{-webkit-box-flex:1;-ms-flex:1;flex:1}.promo.fixed{position:fixed}.promo.show+header.header{margin-top:48px}.header{background:#fff;-webkit-box-shadow:0 1px 0 #dde2e5;box-shadow:0 1px 0 #dde2e5}.header .actions__left,.header__bottom__events{max-width:100%!important;margin:0}.header .header__events-all{margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.header .header__events-all .header__event-slot{-webkit-box-flex:1;-ms-flex:1 100%;flex:1 100%;border-right:1px solid #dde2e5;margin-top:3px;margin-bottom:3px;padding-left:15px;text-align:left;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:5px;min-width:300px}.header .header__events-all .header__event-slot:hover{text-decoration:none!important}.header .header__events-all .header__event-slot img{min-width:40px;height:40px}.header .header__events-all .header__event-slot div{margin-left:10px}.header .header__events-all .header__event-slot span{font-weight:700!important;font-size:.75rem;margin-bottom:0!important;margin-top:0;display:block;line-height:1.125rem;text-align:left}.header .header__events-all .header__event-slot p{font-weight:400;font-size:.625rem;line-height:130%!important;color:#495057!important;margin:0}@media only screen and (min-width:1050px){.header .header__events-all .header__event-slot p{font-size:.625rem}}.header .header__events-all .header__event-slot:first-child{padding-left:0}.header .header__events-all .header__event-slot:last-child{padding-right:0;border-right:0}@media only screen and (min-width:1050px){.header__bottom,.header__middle,.header__top{position:relative;white-space:nowrap}}.header__top{padding:10px 0}@media only screen and (min-width:800px){.header__top{padding:5px 0}}.header__bottom{padding:5px 0;z-index:29;max-width:100%}.header__bottom a{font-size:.8125rem}.header__bottom .trending{margin-left:0;margin-right:0}.header__bottom .actions{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.header__bottom .actions__left{max-width:calc(100% + 8px)}@media only screen and (min-width:800px){.header__bottom .actions__left{max-width:calc(100% + 24px)}}.header__bottom .actions__right{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:none}@media only screen and (min-width:1050px){.header__bottom .actions__right{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__middle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header__middle{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.header__top .actions__left{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center}@media only screen and (min-width:1050px){.header__top .actions__right{max-width:430px}}.no-style.header__nav li:nth-child(3){font-weight:700}.no-style.header__nav li:nth-child(3) a{color:#0e5ef1!important}.header__bottom__events::after{background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),to(#fff));background:linear-gradient(90deg,rgba(255,255,255,0) 0,#fff 100%);content:'';position:absolute;height:60px;right:10px;width:25px}@media only screen and (min-width:1050px){.header__bottom__events::after{display:none}}.contribute-link{font-weight:400;font-size:.6875rem;color:#000!important;position:relative;padding-left:10px}.contribute-link:hover{color:#00791d!important;text-decoration:none!important}.contribute-link::before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1);left:-1px}.my-0{margin-top:0!important;margin-bottom:0!important}.header__desc.my-0{margin-left:0}.header__bottom__events .actions__left{max-width:100%!important;overflow-x:scroll;-ms-overflow-style:none;scrollbar-width:none;display:block;scroll-behavior:smooth;min-width:100%}.header__bottom__events .actions__left::-webkit-scrollbar{display:none}.header__bottom__events .actions__left:-webkit-scrollbar-thumb{background:#fff}.logo{line-height:1rem}.header{position:relative;z-index:41;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.header .input:focus,.header input[type=password]:focus,.header input[type=text]:focus{border:1px solid #00791d}.header a:not(.button):not(.login__action):not(.active){text-decoration:none;color:#222}.header a:not(.button):not(.login__action):not(.active):hover{text-decoration:underline;color:#222}.header__items{display:none;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (min-width:1050px){.header__items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.header__items nav{position:relative;background:0 0;padding:0;left:0;top:0;line-height:inherit;display:block;-webkit-box-shadow:none;box-shadow:none;max-width:100%;max-height:80px}}.header__items>div{width:100%;margin-bottom:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column nowrap;flex-flow:column nowrap}@media only screen and (min-width:552px){.header__items>div:not(:nth-last-child(-n+2)){margin-bottom:32px}}@media only screen and (min-width:552px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/2 - (32px - 32px * 1/2));flex-basis:calc(99.7% * 1/2 - (32px - 32px * 1/2));max-width:calc(99.7% * 1/2 - (32px - 32px * 1/2));width:calc(99.7% * 1/2 - (32px - 32px * 1/2))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(2n){margin-right:0;margin-left:auto}}@media only screen and (min-width:800px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/4 - (32px - 32px * 1/4));flex-basis:calc(99.7% * 1/4 - (32px - 32px * 1/4));max-width:calc(99.7% * 1/4 - (32px - 32px * 1/4));width:calc(99.7% * 1/4 - (32px - 32px * 1/4))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(4n){margin-right:0;margin-left:auto}}@media only screen and (min-width:1050px){.header__items>div{margin-bottom:0!important;margin-right:0!important;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.header__items .language__switcher{display:none}.header__items .language__switcher .li-nav.active>a,.header__items .language__switcher>li.active>a{color:#fff!important}.header__items .language__switcher .li-nav.active>a:hover,.header__items .language__switcher>li.active>a:hover{color:#fff!important;background:#0e5ef1}.header__items .language__switcher .li-nav:hover>a,.header__items .language__switcher>li:hover>a{color:#fff}.header+main{display:block;min-height:210px;-webkit-transition:margin .15s ease;transition:margin .15s ease;margin-top:0!important}.header--hide .header+main{margin-top:50px}.header--hide .header__toggle{opacity:0;top:20px;visibility:hidden}.header--hide .header__logo{max-height:0}.header--hide .header__middle,.header--hide .header__top{max-height:0;overflow:hidden;padding-top:0;padding-bottom:0;border-color:transparent}.header--hide .header__bottom .vue-portal-target{top:3px;right:0;bottom:auto;left:auto;position:absolute}.header__middle,.header__top{-webkit-transition:all .15s ease;transition:all .15s ease}.header__middle{border-bottom:1px solid rgba(0,0,0,.1);z-index:33}.header__middle .vue-portal-target{width:100%}@media only screen and (min-width:1050px){.header__middle .vue-portal-target{display:none}}@media only screen and (min-width:1050px){.header__middle{line-height:5.75rem;text-align:left;padding:0;z-index:30}.header__middle .widget__heading{display:none}}.header__top>.actions__left{display:none}@media only screen and (min-width:1050px){.header__top>.actions__left{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__top>.actions__right{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:0;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.header__top>.actions__right .dropdown__holder{width:calc(100vw - 16px);max-height:80vh}@media only screen and (min-width:600px){.header__top>.actions__right .dropdown__holder{width:auto}}.header__top>.actions__right>*{margin:0}.header__top>.actions__right .search{display:none}@media only screen and (min-width:1050px){.header__top>.actions__right>*{display:-webkit-box;display:-ms-flexbox;display:flex;white-space:nowrap}.header__top>.actions__right .search{display:block}}.header__top .user__login{display:block}.header__top .user__login>.button,.header__top .user__login>button{border-top-right-radius:0;border-bottom-right-radius:0}@media only screen and (min-width:1050px){.header__top{position:relative;right:auto;width:100%}}.header__logo{max-width:165px;position:absolute;top:8px;overflow:hidden;-webkit-transition:all .1s ease;transition:all .1s ease;z-index:32;line-height:2.25rem;height:36px;width:100px;margin-left:50px;-ms-flex-preferred-size:190px;flex-basis:190px}@media only screen and (min-width:800px){.header__logo{top:4px}}@media only screen and (min-width:1050px){.header__logo{position:relative;top:0;overflow:visible;margin-right:20px;margin-left:0;line-height:3.125rem;height:50px}.header__logo>*{width:165px}}@media only screen and (min-width:1280px){.header__logo{margin-right:30px}}.header__desc,.header__more>button{text-transform:capitalize;color:#666;letter-spacing:0;font-size:0;font-weight:400;line-height:1.5rem;vertical-align:top;font-smoothing:antialiased;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI Variable","Segoe UI",system-ui,ui-sans-serif,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-transition:font-size .15s ease-in-out;transition:font-size .15s ease-in-out}@media only screen and (min-width:1050px){.header__desc,.header__more>button{font-size:.6875rem}}.header__desc{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative;width:auto}.header__topics{white-space:nowrap;float:right;position:relative}.header__topics *{display:inline-block;vertical-align:top}.header__topics a{font-size:.8125rem}@media only screen and (min-width:1050px){.header__topics{float:none}}.header__more{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:top}.header__more:before{left:-12px}.header__more:after,.header__more:before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1)}.header__more:after{right:-12px}.header__more:hover{cursor:pointer;color:rgba(0,0,0,.75)}.header__user{display:inline-block;vertical-align:top;white-space:nowrap;margin-left:8px}@media only screen and (min-width:1050px){.header__user{margin-left:0}}.header__user>div{display:inline-block;vertical-align:top}.header__user-nav a:not(.button){text-transform:uppercase;font-size:.75rem;font-weight:600}.header__user-nav a:not(.button):not(.active){opacity:.5}.header__user-nav a:not(.button):not(.active):hover{opacity:.75}.header__user-nav a:not(.button):hover{text-decoration:none}.header__user-nav a:not(.button).active{color:#222;cursor:default;text-decoration:none}.header__user-nav a:not(.button):before{margin-right:0}.header__user-nav a:not(.button):not(:last-child){margin-right:16px}@media only screen and (min-width:1050px){.header__user-nav a:not(.button):not(:last-child){margin-right:32px}}@media only screen and (min-width:1050px){.header__user-nav+.header__topics{margin-left:56px}}.header__search{display:none;vertical-align:top;margin-right:0}@media only screen and (min-width:1050px){.header__search{display:inline-block}}.header__search,.header__user{line-height:inherit}.header__nav{border-bottom:1px solid rgba(0,0,0,.1)}@media only screen and (min-width:800px){.header__nav{border-bottom:0}}.header__nav .button{margin-left:0}.header__nav .button__more{margin-right:20px}.header__nav .li-nav,.header__nav>li{-webkit-transition:all .15s ease;transition:all .15s ease}@media only screen and (min-width:1050px){.header__nav .li-nav,.header__nav>li{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;position:static;border:none;min-height:65px}.header__nav .li-nav:hover.has--subnav .nav .li-nav,.header__nav .li-nav:hover.has--subnav .nav>li,.header__nav>li:hover.has--subnav .nav .li-nav,.header__nav>li:hover.has--subnav .nav>li{white-space:normal}.header__nav .li-nav:hover.has--subnav .nav__subnav,.header__nav>li:hover.has--subnav .nav__subnav{opacity:1;top:100%;visibility:visible;-webkit-transition-delay:.25s;transition-delay:.25s}.header__nav .li-nav:hover.has--subnav .nav__category,.header__nav>li:hover.has--subnav .nav__category{width:100%}.header__nav .li-nav:hover.has--subnav .nav__category:after,.header__nav .li-nav:hover.has--subnav .nav__category:before,.header__nav>li:hover.has--subnav .nav__category:after,.header__nav>li:hover.has--subnav .nav__category:before{-webkit-transition-delay:.25s;transition-delay:.25s;opacity:1}}@media only screen and (min-width:1080px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1280px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1338px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}.header__nav .li-nav>a,.header__nav>li>a{font-size:.875rem;line-height:1.5rem;padding:12px 0;color:#000;display:inline-block;max-width:100%;position:relative;z-index:61;white-space:normal}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{padding:8px 0 0;font-weight:700}}.header__nav .li-nav>a:after,.header__nav .li-nav>a:before,.header__nav>li>a:after,.header__nav>li>a:before{content:'';position:absolute;bottom:-1px;left:50%;width:0;height:0;opacity:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-style:solid;border-width:0 5px 5px 5px;-webkit-transition:opacity .15s ease-in-out;transition:opacity .15s ease-in-out;border-color:transparent transparent #fff transparent}.header__nav .li-nav>a:before,.header__nav>li>a:before{left:50%;bottom:0;border-width:0 6px 6px 6px;border-color:transparent transparent #f5f7f8 transparent}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1rem}}@media only screen and (min-width:1800px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1.125rem}}.header--open{overflow:hidden}@media only screen and (min-width:600px){.header--open{overflow:visible}}.header--open .content-items{max-height:215px;margin:12px 0 24px}.header--open .search{margin-top:16px;display:block}.header--open .header__toggle:before{z-index:10}.header--open .header__toggle>span:nth-child(1){top:50%;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.header--open .header__toggle>span:nth-child(2){opacity:0}.header--open .header__toggle>span:nth-child(3){top:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.header--open .header__items,.header--open .header__items .language__switcher{display:-webkit-box;display:-ms-flexbox;display:flex}.header--open .header__top{z-index:100;position:absolute;left:0;right:8px;background:#fff}@media only screen and (min-width:800px){.header--open .header__top{right:20px}}.header--open .header__top .search{display:none}.header--open .header__logo{z-index:101}.header--open .header__middle{padding-top:60px}.header--open .header__bottom{display:none}.header--open .header__container{max-height:90vh;overflow-x:hidden;overflow-y:auto}@media only screen and (min-width:1050px){.header--open .header__container{overflow:visible}}.header .subnav{position:absolute;-webkit-box-shadow:0 5px 25px 1px rgba(0,0,0,.15);box-shadow:0 5px 25px 1px rgba(0,0,0,.15);background:#fff;visibility:hidden;line-height:1.75rem;max-width:100%;width:100%;left:0;opacity:0;overflow:hidden;border:1px solid #f5f7f8;border-radius:2px;-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;top:105%;z-index:60;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.header .subnav .subnav__categories{-webkit-box-flex:0;-ms-flex:0 1 280px;flex:0 1 280px;padding:24px 0;background:#f5f7f8;margin-right:0!important}.header .subnav .subnav__categories>li{display:block;font-size:.9375rem;padding:2px 48px 2px 24px}.header .subnav .subnav__categories>li a{display:block;font-weight:700}.header .subnav .subnav__categories>li:hover{background:#e1e1e1}.header .subnav .subnav__heading{margin-bottom:20px}.header .subnav .subnav__content{position:relative;-ms-flex-item-align:start;align-self:flex-start;padding:24px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header .subnav .subnav__content{padding-left:32px;padding-right:32px;margin:0 auto;-webkit-box-flex:1;-ms-flex:1 1 600px;flex:1 1 600px}}.header .subnav .subnav__content .heading__container{-ms-flex-preferred-size:100%;flex-basis:100%}.header .subnav .subnav__content:before{content:'';position:absolute;left:0;top:0;bottom:-100%;width:1px;background:rgba(0,0,0,.1)}.languagesEdition .active{font-weight:700}.header__more.dropdown:after{content:'';display:inline-block;vertical-align:middle;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;background-repeat:no-repeat;background-position:center;margin-bottom:2px;width:7px;height:7px;-webkit-transition:-webkit-transform .15s ease;transition:-webkit-transform .15s ease;transition:transform .15s ease;transition:transform .15s ease,-webkit-transform .15s ease;background-color:#fff!important;background-size:contain}.header__more.dropdown button{color:#000!important;margin-right:-20px;padding-right:20px;z-index:1000}.header__more.dropdown .dropdown__holder{width:165px}.header__more.dropdown .dropdown__content{padding:13px;padding-top:5px;padding-bottom:5px}.header__more.dropdown .languagesEdition li{border-bottom:1px solid #e6e6e6}.header__more.dropdown .languagesEdition li:last-child{border:0}.logo__data{display:none;color:#666;font-size:.6875rem}@media only screen and (min-width:1050px){.logo__data{display:block;line-height:.8125rem}}.container{padding-left:12px;padding-right:12px;margin:0 auto;min-width:320px;-webkit-transition:padding .15s ease-in-out;transition:padding .15s ease-in-out}@media only screen and (min-width:600px){.container{padding-left:16px;padding-right:16px}}@media only screen and (min-width:800px){.container{padding-left:20px;padding-right:20px}}@media only screen and (min-width:1250px){.container{padding-left:60px;padding-right:60px}}@media only screen and (min-width:1400px){.container{padding-left:20px;padding-right:20px}}.container.white{background:#fff}.container__inner{max-width:1290px;margin:0 auto;-webkit-transition:max-width .15s ease-out;transition:max-width .15s ease-out}.search{display:block;position:relative;z-index:33;width:100%;max-width:100%;margin:0}.search:before{position:absolute;top:50%;right:24px;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:0;z-index:34}.search__bar{display:block;border-radius:2px;position:relative;z-index:33}.search__bar #search{margin-bottom:0;max-width:100%;background:#fff}.search__go{top:50%;right:0;bottom:0;left:auto;position:absolute;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:32;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:36px;height:36px;line-height:2.25rem;-webkit-box-shadow:none;box-shadow:none;display:block;background:0 0;border:0;font-size:0}@media only screen and (min-width:600px){.search__go{z-index:35}}.header #search,.search__go:hover{cursor:pointer}.header #search{height:36px;position:relative;max-width:100%;background-color:#f5f7f8!important}@media only screen and (min-width:600px){.header #search{font-size:.8125rem;min-width:165px;max-width:100%;opacity:1}}.header #search:hover{cursor:auto}@media only screen and (min-width:1050px){.header #search{margin-left:auto;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.header #search:focus{min-width:215px}}.header #search:focus{cursor:auto}.header #search .field__desc{display:none}.header #searchForm{width:100%;margin-top:8px}.header #searchForm:before{right:8px}@media only screen and (min-width:600px){.header #searchForm{margin-top:16px}}@media only screen and (min-width:1050px){.header #searchForm{margin-top:0}}</style>
+        <script>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date;
+            h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')};
+            (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c;
+        })(window,document.documentElement,'async-hide','dataLayer',4000,
+                {'GTM-W9GJ5DL':true});</script>
+
+        <script type="text/javascript">
+            
+            var loggedIn = false;
+            if (loggedIn) {
+                var userCountryId = '';
+            }
+        </script>
+        
+
+
+
+
+
+
+<script>
+  window.dataLayer = window.dataLayer || [];
+  function gtag(){dataLayer.push(arguments);}
+
+  //CookieControl tool recomendation
+  // Call the default command before gtag.js or Tag Manager runs to
+  // adjust how the tags operate when they run. Modify the defaults
+  // per your business requirements and prior consent granted/denied, e.g.:
+  gtag('consent', 'default', {
+      'ad_storage': 'denied',
+      'ad_user_data': 'denied',
+      'ad_personalization': 'denied',
+      'analytics_storage': 'denied',
+      wait_for_update: 500
+  });
+  gtag('set', 'ads_data_redaction', true);
+  gtag('set', 'url_passthrough', true);
+
+  if((typeof loggedIn != "undefined") && loggedIn){
+      window.dataLayer.push({'logged_in': 'true'});
+  } else {
+      window.dataLayer.push({'logged_in': 'false'});
+  }
+
+  window.dataLayer.push({'show_queryz': ''});
+
+  gtag('config', 'G-VMVPD4D2JY');
+</script>
+
+<!-- Google Tag Manager -->
+<script>
+var gtmProfile="GTM-W9GJ5DL";
+(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+})(window,document,'script','dataLayer', gtmProfile);</script>
+<!-- End Google Tag Manager -->
+
+        <title>FRP in ClojureScript with Javelin - InfoQ</title>
+        <link rel="canonical" href="https://www.infoq.com/presentations/ClojureScript-Javelin/"/>
+        <link rel="alternate" href="https://www.infoq.com/presentations/ClojureScript-Javelin/" hreflang="en"/>
+        
+
+
+
+
+
+
+
+    
+        
+        
+        
+            
+            <link rel="alternate" href="https://www.infoq.com/presentations/ClojureScript-Javelin/" hreflang="x-default" />
+        
+    
+    
+
+
+
+
+
+
+
+        
+        
+
+
+
+
+
+<meta http-equiv="pragma" content="no-cache" />
+<meta http-equiv="cache-control" content="private,no-cache,no-store,must-revalidate" />
+<meta http-equiv="expires" content="0" />
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="copyright" content="&copy; 2006 C4Media" />
+
+<meta name="google-site-verification" content="0qInQx_1WYOeIIbxnh7DnXlw1XOxNgAYakO2k4GhNnY" />
+<meta name="msapplication-TileColor" content="#ffffff"/>
+<meta name="msapplication-TileImage" content="/styles/static/images/logo/logo.jpg"/>
+<meta property="wb:webmaster" content="3eac1729a8bbe046" />
+<meta content="width=device-width,initial-scale=1" name="viewport">
+<meta http-equiv="X-UA-Compatible" content="IE=10, IE=edge">
+
+        
+        <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style.css"/>
+        <link rel="stylesheet" type="text/css" media="print" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/print.css"/>
+        <link rel="preload" type="text/css" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_en.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
+        <link rel="preload" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/icons.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
+        <link rel="preload" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_extra.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
+        <noscript>
+            <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_en.css"/>
+            <link rel="stylesheet" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/icons.css">
+            <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_extra.css"/>
+        </noscript>
+
+        <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/fonts/font.css"/>
+
+        <link rel="shortcut icon" href="https://cdn.infoq.com/statics_s1_20260729094803/favicon.ico" type="image/x-icon" />
+        <link rel="apple-touch-icon" href="https://cdn.infoq.com/statics_s1_20260729094803/apple-touch-icon.png"/>
+
+        <script type="text/javascript">
+        	var device='desktop';
+            var InfoQConstants = {};
+            InfoQConstants.language = 'en';
+            InfoQConstants.countryCode = '';
+            
+                
+                InfoQConstants.scp = '[redacted transient player authorization]';
+                InfoQConstants.scs = '[redacted transient player authorization]';
+                InfoQConstants.sck = '[redacted transient player authorization]';
+                InfoQConstants.scd = '.infoq.com';
+                InfoQConstants.sct = '7200';
+                
+            
+            InfoQConstants.pageUrl = (typeof window.location != 'undefined' && window.location && typeof window.location.href != 'undefined' && window.location.href) ? window.location.href : "URL_UNAVAILABLE";
+            InfoQConstants.cet='nRxqwtCq9cL9K39j';
+            InfoQConstants.userDetectedCountryCode = '';
+            InfoQConstants.bpadb = 'Ceq6VfqVEhhRZDLhUeuo';
+        </script>
+
+        <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/combinedJs.min.js"></script>
+        <script type="text/javascript">
+            
+                var JSi18n = JSi18n || {}; // define only if not already defined
+                JSi18n.error='Error';
+                JSi18n.login_unverifiedAccount='Unverified account';
+                JSi18n.contentSummary_showPresentations_1='';
+                JSi18n.contentSummary_showPresentations_2='';
+                JSi18n.contentSummary_showPresentations_3='';
+                JSi18n.contentSummary_showInterviews_1='';
+                JSi18n.contentSummary_showInterviews_2='';
+                JSi18n.contentSummary_showInterviews_3='';
+                JSi18n.contentSummary_showMinibooks_1='';
+                JSi18n.contentSummary_showMinibooks_2='';
+                JSi18n.login_sendingRequest='Sending request ...';
+                JSi18n.bookmark_saved='<q>&nbsp;&nbsp;&nbsp;Saved&nbsp;&nbsp;&nbsp;&nbsp;</q>';
+                JSi18n.bookmark_error='<q style=color:black;>&nbsp;&nbsp;&nbsp;Error&nbsp;&nbsp;&nbsp;&nbsp;</q>';
+                JSi18n.categoryManagement_showpopup_viewAllLink_viewAllPrefix='View All';
+                JSi18n.categoryManagement_showpopup_viewAllLink_viewAllSuffix='';
+                JSi18n.categoryManagement_showpopup_includeExcludeLink_Exclude='Exclude';
+                JSi18n.categoryManagement_showpopup_includeExcludeLink_Include='Include';
+                JSi18n.login_invalid_email='Please specify a valid email';
+                JSi18n.login_email_not_found = 'No user found with that email';
+                JSi18n.content_datetime_format='MMM dd, yyyy';
+
+                // used by frontend
+                JSi18n.FE = {
+                    labels: {
+                        follow: "Follow",
+                        followTopic: "Follow Topic",
+                        unfollow: "Unfollow",
+                        unfollowTopic: "Unfollow Topic",
+                        following: "Following",
+                        followers: "Followers",
+                        like: "Like",
+                        liked: "Liked",
+                        authors: "Peers",
+                        users : "Users",
+                        topics: "Topics",
+                        hide: "Hide Item",
+                        hidden: "%s was hidden on your profile page.",
+                        undo: "Undo",
+                        showLess: "Show less",
+                        showMore: "Show more",
+                        moreAuthors: "And %s more",
+                        bookmarked: "Content Bookmarked",
+                        unbookmarked: "Content Unbookmarked",
+                        characterLimit: "Characters Remaining"
+                    }
+                }
+            
+
+
+            
+            
+                var usersInPage = JSON.parse('[{\"id\":\"62671158\",\"ref\":\"author-Monica-Beckwith\",\"url\":\"\/profile\/Monica-Beckwith\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Monica Beckwith\",\"bio\":\"\",\"followers\":1827,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/QhDv7pXEUK1sdLsYArFmnLxecH4rYhAc.jpg\"},{\"id\":\"45723890\",\"ref\":\"author-Rags-Srinivas\",\"url\":\"\/profile\/Rags-Srinivas\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Rags Srinivas\",\"bio\":\"\",\"followers\":354,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/t4nyfgw1THkp4wMZ9EZ59RGJx8Hf9Rk8.jpg\"},{\"id\":\"87551248\",\"ref\":\"author-Steef~Jan-Wiggers\",\"url\":\"\/profile\/Steef~Jan-Wiggers\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Queue Lead Editor | Domain Architect | Cloud Expert\",\"name\":\"Steef-Jan Wiggers\",\"bio\":\"\",\"followers\":887,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/BhZx03k3Hj0pZVXmTzGqItwZxtJ06oIb.jpg\"},{\"id\":\"101760482\",\"ref\":\"author-Alan-Dipert\",\"url\":\"\/profile\/Alan-Dipert\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Alan Dipert\",\"bio\":\"\",\"followers\":2,\"imgSrc\":\"\"},{\"id\":\"80977916\",\"ref\":\"author-Thomas-Betts\",\"url\":\"\/profile\/Thomas-Betts\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Laureate Application Architect at Blackbaud\",\"name\":\"Thomas Betts\",\"bio\":\"\",\"followers\":1161,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/pSqI6HrU3k9rmmVjwS34OHG0bOMYiE6a.jpg\"},{\"id\":\"72028228\",\"ref\":\"author-Sergio-De-Simone\",\"url\":\"\/profile\/Sergio-De-Simone\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Sergio De Simone\",\"bio\":\"\",\"followers\":771,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/NovciOoQOAYWqYqRQBFo97SuMm0xbUiC.jpg\"},{\"id\":\"126467140\",\"ref\":\"author-Renato-Losio\",\"url\":\"\/profile\/Renato-Losio\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Expert | AWS Data Hero  \",\"name\":\"Renato Losio\",\"bio\":\"\",\"followers\":901,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/ptroF8HdI2vWXm0NDaKeS0JdiPxMOAra.jpg\"},{\"id\":\"126464202\",\"ref\":\"author-Johan-Janssen\",\"url\":\"\/profile\/Johan-Janssen\",\"followedByCurrentUser\":false,\"minibio\":\"Architect at ASML\",\"name\":\"Johan Janssen\",\"bio\":\"\",\"followers\":530,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/Fb4eZ0mtvMf6MhsmBIhsUVueV4xAs2FD.jpg\"},{\"id\":\"39485652\",\"ref\":\"author-Daniel-Bryant\",\"url\":\"\/profile\/Daniel-Bryant\",\"followedByCurrentUser\":false,\"minibio\":\"InfoQ News Manager | Building Platforms at Syntasso\",\"name\":\"Daniel Bryant\",\"bio\":\"\",\"followers\":2742,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/tSe5dczMaSGtRUm18VkTR2tcF4W3SogA.jpg\"},{\"id\":\"63268344\",\"ref\":\"author-Chris-Swan\",\"url\":\"\/profile\/Chris-Swan\",\"followedByCurrentUser\":false,\"minibio\":\"Engineer, Atsign\",\"name\":\"Chris Swan\",\"bio\":\"\",\"followers\":1871,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/8PE76nOujWAoCM8yqLn9Hfv2HqW3VlIP.jpg\"},{\"id\":\"4927376\",\"ref\":\"author-Karsten-Silz\",\"url\":\"\/profile\/Karsten-Silz\",\"followedByCurrentUser\":false,\"minibio\":\"Full-Stack Java Developer\",\"name\":\"Karsten Silz\",\"bio\":\"\",\"followers\":397,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/p6zmOdOcqXiRj09iiZNeDZap7f0IglQW.jpg\"},{\"id\":\"343314\",\"ref\":\"author-Jonathan-Allen\",\"url\":\"\/profile\/Jonathan-Allen\",\"followedByCurrentUser\":false,\"minibio\":\"Software Architect\",\"name\":\"Jonathan Allen\",\"bio\":\"\",\"followers\":1828,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/Wk_C09_mzwK23YkTkKMXResJv3LKUN5D.jpg\"},{\"id\":\"114725059\",\"ref\":\"author-Holly-Cummins\",\"url\":\"\/profile\/Holly-Cummins\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Technical Staff Member, IBM\",\"name\":\"Holly Cummins\",\"bio\":\"\",\"followers\":607,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/cRsuGlFgKyGmGfEHvafpMO63CxbrEm22.jpg\"}]');
+            
+
+            
+            
+                var topicsInPage = JSON.parse('[{\"name\":\"Architecture & Design\",\"id\":\"6816\",\"url\":\"\/architecture-design\",\"followers\":10335,\"followedByCurrentUser\":false},{\"name\":\"Clojure\",\"id\":\"4929\",\"url\":\"\/Clojure\",\"followers\":126,\"followedByCurrentUser\":false},{\"name\":\"Java\",\"id\":\"1\",\"url\":\"\/java\",\"followers\":4940,\"followedByCurrentUser\":false},{\"name\":\"Compilers\",\"id\":\"3617\",\"url\":\"\/Compilers\",\"followers\":15,\"followedByCurrentUser\":false},{\"name\":\"Culture & Methods\",\"id\":\"6817\",\"url\":\"\/culture-methods\",\"followers\":3983,\"followedByCurrentUser\":false},{\"name\":\"Clojure\/West\",\"id\":\"7298\",\"url\":\"\/Clojure-West\",\"followers\":2,\"followedByCurrentUser\":false},{\"name\":\"Clojure\/West 2013\",\"id\":\"14627\",\"url\":\"\/Clojure-West-2013\",\"followers\":1,\"followedByCurrentUser\":false},{\"name\":\".NET Core\",\"id\":\"15683\",\"url\":\"\/Net-Core\",\"followers\":7994,\"followedByCurrentUser\":false},{\"name\":\"JVM Languages\",\"id\":\"7236\",\"url\":\"\/JVM_Langugaes\",\"followers\":64,\"followedByCurrentUser\":false},{\"name\":\"Machine Learning\",\"id\":\"5449\",\"url\":\"\/MachineLearning\",\"followers\":14681,\"followedByCurrentUser\":false},{\"name\":\"Microservices\",\"id\":\"15274\",\"url\":\"\/microservices\",\"followers\":22276,\"followedByCurrentUser\":false},{\"name\":\"LISP\",\"id\":\"1010\",\"url\":\"\/lisp\",\"followers\":17,\"followedByCurrentUser\":false},{\"name\":\"AI, ML & Data Engineering\",\"id\":\"16690\",\"url\":\"\/ai-ml-data-eng\",\"followers\":6022,\"followedByCurrentUser\":false},{\"name\":\"Java9\",\"id\":\"7097\",\"url\":\"\/Java9\",\"followers\":5517,\"followedByCurrentUser\":false},{\"name\":\"ClojureScript\",\"id\":\"7131\",\"url\":\"\/ClojureScript\",\"followers\":26,\"followedByCurrentUser\":false},{\"name\":\"DevOps\",\"id\":\"6043\",\"url\":\"\/Devops\",\"followers\":5109,\"followedByCurrentUser\":false},{\"name\":\"Reactive Programming\",\"id\":\"15453\",\"url\":\"\/reactive-programming\",\"followers\":12391,\"followedByCurrentUser\":false},{\"name\":\"Development\",\"id\":\"6815\",\"url\":\"\/development\",\"followers\":4142,\"followedByCurrentUser\":false},{\"name\":\"Asynchronous Programming\",\"id\":\"6415\",\"url\":\"\/Asynchronous\",\"followers\":57,\"followedByCurrentUser\":false}]');
+            
+
+            var userContentLikesInPage = [];
+            var userCommentsLikesInPage = [];
+
+
+            var currentUserId = -47881837;
+        </script>
+        
+
+        
+        
+        
+            
+
+
+
+
+
+
+<!-- Latest Version -->
+<script src="https://cc.cdn.civiccomputing.com/9/cookieControl-9.x.min.js" type="text/javascript"></script>
+<script>
+    const config = {
+        apiKey: '8910ea974a96ffb6f927952b4ae9b9b0cc3e5973',
+        product: 'PRO_MULTISITE',
+
+        // general settings
+        consentCookieExpiry: 90,
+        encodeCookie: true,
+        sameSiteCookie: true, // if false, cookie set as SameSite=None;secure;
+        sameSiteValue: ';secure', // either 'Strict', 'Lax', or 'None'
+        subDomains: true,
+        initialState: 'notify',   // 'notify','top','box' require pro licence
+        notifyOnce: false,
+        setInnerHTML: true,
+
+        //layout settings
+        layout: 'slideout',
+        position: 'left',
+        theme: 'light',
+        acceptButton: true,
+        rejectButton: true,
+        closeOnGlobalChange: true,
+        closeStyle: 'icon',
+        toggleType: 'slider',
+        notifyDismissButton: true,
+        settingsStyle: 'link',
+        excludedCountries: ['US'],
+
+        /*accessibility: {
+            disableSiteScrolling: true,
+        },*/
+
+        statement: {
+            description: 'For more detailed information about the cookies we use, see our',
+            name: 'Cookie Policy',
+            url: 'https://www.infoq.com/cookie-policy',
+            updated: '01/01/2024',
+        },
+
+        // cookies starting from 'cookie_expire' are from live.infoq.com but since we use the same tool on the same domain we need to specify those too so
+        // that infoq.com cookieControl does not delete live.infoq.com cookies(also infoq.com cookies have been specified in live.infoq.com cookieControl configs)
+        necessaryCookies: ['RegUserCookie', 'UserCookie', 'IdpCookie', 'ConversionTrackingV2_','PSAdialog','*P13NWN*','topbarSurvey','__bkm','JSESSIONID','mp_','_mixpanel','CloudFront-Key-Pair-Id','CloudFront-Policy','CloudFront-Signature','cookie_expire','discount_promo_closed','discount_promo_code','discount_promo_submitted','exit_survey_popup','referrer_popup','voting_popup_*','AWSALB','AWSALBCORS','aws-waf-token'],
+
+        optionalCookies: [
+            {
+                name: 'analytics',
+                label: 'Analytics',
+                description: 'Analytical cookies help us to improve our website by collecting and reporting information on its usage.',
+                cookies: ['_ga', '_ga*', '_gid', '_gat', '__utma', '__utmt', '__utmb', '__utmc', '__utmz', '__utmv'],
+                onAccept: function(){
+                    gtag('consent', 'update', {'analytics_storage': 'granted'});
+                },
+                onRevoke: function(){
+                    gtag('consent', 'update', {'analytics_storage': 'denied'});
+                }
+            },
+            {
+                name: 'marketing',
+                label: 'Advertising',
+                description: 'We use advertising cookies to display advertisements to you for our products.',
+                onAccept: function(){
+                    gtag('consent', 'update', {'ad_storage': 'granted', 'ad_personalization': 'granted', 'ad_user_data': 'granted'});
+                },
+                onRevoke: function(){
+                    gtag('consent', 'update', {'ad_storage': 'denied', 'ad_personalization': 'denied', 'ad_user_data': 'denied'});
+                }
+            }
+        ],
+
+        text : {
+            // main preference panels
+            title: '<h3>Our use of cookies</h3>',
+            intro: 'We use necessary cookies to make our site work. Functional cookies help enhance the performance and functionality of the site. '+
+                'We\'d also like to set analytics cookies to help us improve your experience by measuring how you use the site. '+
+                'These will be set only if you accept. ',
+            acceptSettings: 'I Accept',
+            rejectSettings: 'I Do Not Accept',
+            necessaryTitle : '<h3>Necessary Cookies</h3>',
+            necessaryDescription :  'Necessary cookies enable core functionality ' +
+                'such as page navigation and access to secure areas. '+
+                'The website cannot function properly without '+
+                'these cookies, and can only be disabled by changing '+
+                'your browser preferences.',
+            closeLabel: 'Close Cookie Control',
+            cornerButton: 'Set cookie preferences',
+            // main preference panel controls
+            on: 'On',
+            off : 'Off',
+            thirdPartyTitle : 'Some cookies require your attention',
+            thirdPartyDescription : 'Consent for the following cookies could not be '+
+                'automatically revoked. Please follow the link(s) '+
+                'below to opt out manually.',
+            // notification panels (only accessible for pro licences)
+            notifyTitle : 'Your choice regarding cookies on this site',
+            notifyDescription : 'We use cookies to optimise site functionality and '+
+                'give you the best possible experience.',
+            accept : 'I Accept',
+            reject: 'I Do Not Accept',
+            settings : 'Settings',
+        },
+        branding : {
+            removeAbout: true,
+        },
+    };
+    // do not load this for local envs only. for testing on local envs remove/modify this condition
+    if(InfoQConstants.pageUrl.indexOf('local')===-1){
+        CookieControl.load( config );
+    }
+</script>
+        
+
+        
+        
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+
+
+
+
+<script type="application/ld+json">
+{
+  "@context": "http://schema.org",
+  "@type": "NewsArticle",
+  "mainEntityOfPage": {
+    "@type": "WebPage",
+    "@id": "https://www.infoq.com/presentations/ClojureScript-Javelin/"
+    },
+  "headline": "FRP in ClojureScript with Javelin",
+  "image": ["https://res.infoq.com/presentations/ClojureScript-Javelin/en/mediumimage/Dipbig.jpg"
+   ],
+  "datePublished": "2013-07-16T22:00:00+0000",
+  "dateModified": "2013-07-16T22:00:00+0000",
+  "author": [
+    {
+    "@type": "Person",
+    "name": "Alan Dipert",
+    "url": "https://www.infoq.com/profile/Alan-Dipert/"
+    }
+  ],
+   "publisher": {
+    "@type": "Organization",
+    "name": "InfoQ",
+    "logo": {
+      "@type": "ImageObject",
+      "url": "https://assets.infoq.com/resources/en/logo_scrubber_big_4_3.jpg"
+    }
+  },
+  "description": "Alan Dipert introduces Javelin, a ClojureScript library, demonstrating how it can be used to express a variety of asynchronous workflows in concise and composable ways.",
+  "video":
+  {
+   "@type": "VideoObject",
+   "name": "FRP in ClojureScript with Javelin",
+   "description": "Alan Dipert introduces Javelin, a ClojureScript library, demonstrating how it can be used to express a variety of asynchronous workflows in concise and composable ways.",
+   "thumbnailUrl": [
+      "https://res.infoq.com/presentations/ClojureScript-Javelin/en/mediumimage/Dipbig.jpg"
+   ],
+   "uploadDate": "2013-07-16T22:00:00+0000",
+   "duration": "PT39M8S",
+   "contentUrl": "https://videog.infoq.com/presentations/13-mar-frpinclojurescript.mp4"
+  },
+  "isAccessibleForFree": "False",
+  "hasPart":
+  {
+    "@type": "WebPageElement",
+    "isAccessibleForFree": "False",
+    "cssSelector" : ".paywallPdf"
+  }
+}
+</script>
+
+        <meta name="ifq:pageType" content="PRESENTATION_PAGE"/>
+        <script type="text/javascript">
+            InfoQConstants.pageType = 'PRESENTATION_PAGE';
+        </script>
+        
+            
+            
+            
+
+
+
+
+
+
+
+<meta property="og:type" content="website" />
+
+
+
+
+
+
+    
+
+
+
+    
+    
+    
+        <meta property="og:image" content="https://res.infoq.com/presentations/ClojureScript-Javelin/en/mediumimage/Dipbig.jpg"/>
+    
+    
+    
+    
+
+
+    
+    
+    
+        <meta property="twitter:image" content="https://res.infoq.com/presentations/ClojureScript-Javelin/en/mediumimage/Dipbig.jpg"/>
+    
+    
+    
+    
+
+
+<meta property="og:title" content="FRP in ClojureScript with Javelin "/>
+<meta property="og:description" content="Alan Dipert introduces Javelin, a ClojureScript library, demonstrating how it can be used to express a variety of asynchronous workflows in concise and composable ways." />
+<meta property="og:site_name" content="InfoQ"/>
+<meta property="og:url" content="https://www.infoq.com/presentations/ClojureScript-Javelin/"/>
+
+<meta name="twitter:card" content="summary_large_image" />
+<meta name="twitter:title" content="FRP in ClojureScript with Javelin "/>
+<meta name="twitter:description" content="Alan Dipert introduces Javelin, a ClojureScript library, demonstrating how it can be used to express a variety of asynchronous workflows in concise and composable ways." />
+
+            
+            
+                <link rel="image_src" href="https://res.infoq.com/presentations/ClojureScript-Javelin/en/mediumimage/Dipbig.jpg"/>
+            
+            
+            <meta name="keywords" content="ClojureScript Javelin,Development,Clojure,Clojure/West 2013,ClojureScript,JVM Languages,Java,Clojure/West,Compilers,Asynchronous Programming,LISP,"/>
+            <meta name="description" content="Alan Dipert introduces Javelin, a ClojureScript library, demonstrating how it can be used to express a variety of asynchronous workflows in concise and composable ways."/>
+            <meta name="tprox" content="1374012000000" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js"></script>
+        <script type="text/javascript">
+            var slides = new Array('https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl1.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl2.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl3.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl4.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl5.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl6.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl7.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl8.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl9.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl10.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl11.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl12.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl13.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl14.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl15.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl16.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl17.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl18.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl19.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl20.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl21.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl22.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl23.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl24.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl25.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl26.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl27.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl28.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl29.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl30.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl31.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl32.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl33.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl34.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl35.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl36.jpg','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/ClojureScript-Javelin/en/slides/sl37.jpg'),
+                TIMES = new Array(0,94,116,139,194,220,311,353,382,400,432,480,536,562,597,623,707,774,912,1043,1135,1165,1179,1291,1326,1346,1362,1403,1446,1548,1818,1890,2045,2096,2195,2248,2327,2348),
+                EXPRESSINSTALL_SWF = 'https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/flash/expressinstall.swf',
+                SVMPLAYER_SWF = 'https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/flash/svmplayer.swf',
+                isWideScreen = false,
+                // i18n text for the to full view/minimize button
+                i18nFullScreen = 'Full',
+                i18nMinimize = 'Minimize',
+                demoTimings = '';
+            var playerSplash = 'https://cdn.infoq.com/statics_s1_20260729094803/styles/static/images/logo/logo_scrubber_16_9.jpg';
+            
+            var vhf = 'cnRtcGU6Ly92aWRlb2YuaW5mb3EuY29tL2NmeC9zdC8=';
+            var jsclassref = 'cHJlc2VudGF0aW9ucy8xMy1tYXItZnJwaW5jbG9qdXJlc2NyaXB0Lm1wNA==';
+        </script>
+        
+            <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/player/PlayerPresentation_mobile.js"></script>
+            <script type="text/javascript">
+                $(document).ready(function() {
+                    init();
+                 });
+            </script>
+        
+
+        <script type='text/javascript' src='https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/videoPlayercombinedJsPresentation.js'></script>
+
+        <script type='text/javascript' src='https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/PresentationUI.js'></script>
+        <script type='text/javascript' src='https://cdn.infoq.com/statics_s1_20260729094803/scripts/ui/jquery.tipsy.js'></script>
+        <link rel="stylesheet" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/tipsy.css" type="text/css" />
+        <script type="text/javascript">
+            P.s = 'https://videoh.infoq.com/presentations/13-mar-frpinclojurescript.mp4';
+        </script>
+        <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/relatedVcr.min.js"></script>
+        <script type="application/javascript">
+            var communityIds = "2497";
+            var topicIds = "1452,3364,2676,2768,1,2829,957,2198,758";
+            VCR.loadAllVcrs(communityIds, topicIds);
+        </script>
+
+    
+        
+        
+        
+        <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/infoq.js"></script>
+
+        <script type="text/javascript">
+           document.addEventListener('DOMContentLoaded', function() {
+               if (!window || !window.infoq) return
+               infoq.init()
+           })
+       </script>
+
+       <script defer data-domain="infoq.com" src="https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js"></script>
+       <script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
+
+    </head>
+
+    <body >
+        
+
+
+
+
+
+
+<!-- Google Tag Manager (noscript) -->
+<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9GJ5DL"
+height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
+<!-- End Google Tag Manager (noscript) -->
+        
+            <div class="intbt">
+                <a href="/int/bt/" title="bt">BT</a>
+            </div>
+        
+
+        
+
+
+
+
+
+
+<script type="text/javascript">
+    var allCountries = [{"id":3,"name":"Afghanistan"},{"id":244,"name":"Åland"},{"id":6,"name":"Albania"},{"id":61,"name":"Algeria"},{"id":13,"name":"American Samoa"},{"id":1,"name":"Andorra"},{"id":9,"name":"Angola"},{"id":5,"name":"Anguilla"},{"id":11,"name":"Antarctica"},{"id":4,"name":"Antigua and Barbuda"},{"id":12,"name":"Argentina"},{"id":7,"name":"Armenia"},{"id":16,"name":"Aruba"},{"id":15,"name":"Australia"},{"id":14,"name":"Austria"},{"id":17,"name":"Azerbaijan"},{"id":31,"name":"Bahamas"},{"id":24,"name":"Bahrain"},{"id":20,"name":"Bangladesh"},{"id":19,"name":"Barbados"},{"id":35,"name":"Belarus"},{"id":21,"name":"Belgium"},{"id":36,"name":"Belize"},{"id":26,"name":"Benin"},{"id":27,"name":"Bermuda"},{"id":32,"name":"Bhutan"},{"id":29,"name":"Bolivia"},{"id":254,"name":"Bonaire, Sint Eustatius, and Saba"},{"id":18,"name":"Bosnia and Herzegovina"},{"id":34,"name":"Botswana"},{"id":33,"name":"Bouvet Island"},{"id":30,"name":"Brazil"},{"id":104,"name":"British Indian Ocean Territory"},{"id":28,"name":"Brunei Darussalam"},{"id":23,"name":"Bulgaria"},{"id":22,"name":"Burkina Faso"},{"id":25,"name":"Burundi"},{"id":114,"name":"Cambodia"},{"id":46,"name":"Cameroon"},{"id":37,"name":"Canada"},{"id":52,"name":"Cape Verde"},{"id":121,"name":"Cayman Islands"},{"id":40,"name":"Central African Republic"},{"id":207,"name":"Chad"},{"id":45,"name":"Chile"},{"id":47,"name":"China"},{"id":53,"name":"Christmas Island"},{"id":38,"name":"Cocos (Keeling) Islands"},{"id":48,"name":"Colombia"},{"id":116,"name":"Comoros"},{"id":39,"name":"Congo (Democratic Republic)"},{"id":41,"name":"Congo (People\u0027s Republic)"},{"id":44,"name":"Cook Islands"},{"id":49,"name":"Costa Rica"},{"id":43,"name":"Cote D\u0027Ivoire"},{"id":97,"name":"Croatia"},{"id":51,"name":"Cuba"},{"id":253,"name":"Curaçao"},{"id":54,"name":"Cyprus"},{"id":55,"name":"Czech Republic"},{"id":58,"name":"Denmark"},{"id":57,"name":"Djibouti"},{"id":59,"name":"Dominica"},{"id":60,"name":"Dominican Republic"},{"id":213,"name":"East Timor"},{"id":62,"name":"Ecuador"},{"id":64,"name":"Egypt"},{"id":203,"name":"El Salvador"},{"id":87,"name":"Equatorial Guinea"},{"id":66,"name":"Eritrea"},{"id":63,"name":"Estonia"},{"id":68,"name":"Ethiopia"},{"id":72,"name":"Falkland Islands (Malvinas)"},{"id":74,"name":"Faroe Islands"},{"id":71,"name":"Fiji"},{"id":70,"name":"Finland"},{"id":75,"name":"France"},{"id":80,"name":"French Guiana"},{"id":170,"name":"French Polynesia"},{"id":208,"name":"French Southern Territories"},{"id":76,"name":"Gabon"},{"id":84,"name":"Gambia"},{"id":79,"name":"Georgia"},{"id":56,"name":"Germany"},{"id":81,"name":"Ghana"},{"id":82,"name":"Gibraltar"},{"id":88,"name":"Greece"},{"id":83,"name":"Greenland"},{"id":78,"name":"Grenada"},{"id":86,"name":"Guadeloupe"},{"id":91,"name":"Guam"},{"id":90,"name":"Guatemala"},{"id":249,"name":"Guernsey"},{"id":85,"name":"Guinea"},{"id":92,"name":"Guinea-Bissau"},{"id":93,"name":"Guyana"},{"id":98,"name":"Haiti"},{"id":95,"name":"Heard Island and McDonald Islands"},{"id":96,"name":"Honduras"},{"id":94,"name":"Hong Kong"},{"id":99,"name":"Hungary"},{"id":107,"name":"Iceland"},{"id":103,"name":"India"},{"id":100,"name":"Indonesia"},{"id":106,"name":"Iran"},{"id":105,"name":"Iraq"},{"id":101,"name":"Ireland"},{"id":245,"name":"Isle of Man"},{"id":102,"name":"Israel"},{"id":108,"name":"Italy"},{"id":109,"name":"Jamaica"},{"id":111,"name":"Japan"},{"id":250,"name":"Jersey"},{"id":110,"name":"Jordan"},{"id":122,"name":"Kazakhstan"},{"id":112,"name":"Kenya"},{"id":115,"name":"Kiribati"},{"id":243,"name":"Kosovo"},{"id":120,"name":"Kuwait"},{"id":113,"name":"Kyrgyzstan"},{"id":123,"name":"Laos"},{"id":132,"name":"Latvia"},{"id":124,"name":"Lebanon"},{"id":129,"name":"Lesotho"},{"id":128,"name":"Liberia"},{"id":133,"name":"Libya"},{"id":126,"name":"Liechtenstein"},{"id":130,"name":"Lithuania"},{"id":131,"name":"Luxembourg"},{"id":143,"name":"Macau"},{"id":139,"name":"Macedonia"},{"id":137,"name":"Madagascar"},{"id":151,"name":"Malawi"},{"id":153,"name":"Malaysia"},{"id":150,"name":"Maldives"},{"id":140,"name":"Mali"},{"id":148,"name":"Malta"},{"id":138,"name":"Marshall Islands"},{"id":145,"name":"Martinique"},{"id":146,"name":"Mauritania"},{"id":149,"name":"Mauritius"},{"id":238,"name":"Mayotte"},{"id":152,"name":"Mexico"},{"id":73,"name":"Micronesia"},{"id":136,"name":"Moldova"},{"id":135,"name":"Monaco"},{"id":142,"name":"Mongolia"},{"id":246,"name":"Montenegro"},{"id":147,"name":"Montserrat"},{"id":134,"name":"Morocco"},{"id":154,"name":"Mozambique"},{"id":141,"name":"Myanmar"},{"id":155,"name":"Namibia"},{"id":164,"name":"Nauru"},{"id":163,"name":"Nepal"},{"id":161,"name":"Netherlands"},{"id":8,"name":"Netherlands Antilles"},{"id":156,"name":"New Caledonia"},{"id":166,"name":"New Zealand"},{"id":160,"name":"Nicaragua"},{"id":157,"name":"Niger"},{"id":159,"name":"Nigeria"},{"id":165,"name":"Niue"},{"id":158,"name":"Norfolk Island"},{"id":118,"name":"North Korea"},{"id":144,"name":"Northern Mariana Islands"},{"id":162,"name":"Norway"},{"id":167,"name":"Oman"},{"id":173,"name":"Pakistan"},{"id":180,"name":"Palau"},{"id":178,"name":"Palestinian Territory"},{"id":168,"name":"Panama"},{"id":171,"name":"Papua New Guinea"},{"id":181,"name":"Paraguay"},{"id":169,"name":"Peru"},{"id":172,"name":"Philippines"},{"id":176,"name":"Pitcairn"},{"id":174,"name":"Poland"},{"id":179,"name":"Portugal"},{"id":177,"name":"Puerto Rico"},{"id":182,"name":"Qatar"},{"id":183,"name":"Reunion"},{"id":184,"name":"Romania"},{"id":185,"name":"Russian Federation"},{"id":186,"name":"Rwanda"},{"id":193,"name":"Saint Helena"},{"id":117,"name":"Saint Kitts and Nevis"},{"id":125,"name":"Saint Lucia"},{"id":251,"name":"Saint Martin"},{"id":175,"name":"Saint Pierre and Miquelon"},{"id":229,"name":"Saint Vincent and the Grenadines"},{"id":247,"name":"Saint-Barthélemy"},{"id":236,"name":"Samoa"},{"id":198,"name":"San Marino"},{"id":202,"name":"Sao Tome and Principe"},{"id":187,"name":"Saudi Arabia"},{"id":199,"name":"Senegal"},{"id":248,"name":"Serbia"},{"id":189,"name":"Seychelles"},{"id":197,"name":"Sierra Leone"},{"id":192,"name":"Singapore"},{"id":252,"name":"Sint Maarten"},{"id":196,"name":"Slovakia"},{"id":194,"name":"Slovenia"},{"id":188,"name":"Solomon Islands"},{"id":200,"name":"Somalia"},{"id":239,"name":"South Africa"},{"id":89,"name":"South Georgia and the South Sandwich Islands"},{"id":119,"name":"South Korea"},{"id":255,"name":"South Sudan"},{"id":67,"name":"Spain"},{"id":127,"name":"Sri Lanka"},{"id":190,"name":"Sudan"},{"id":201,"name":"Suriname"},{"id":195,"name":"Svalbard and Jan Mayen"},{"id":205,"name":"Swaziland"},{"id":191,"name":"Sweden"},{"id":42,"name":"Switzerland"},{"id":204,"name":"Syria"},{"id":220,"name":"Taiwan"},{"id":211,"name":"Tajikistan"},{"id":221,"name":"Tanzania"},{"id":210,"name":"Thailand"},{"id":209,"name":"Togo"},{"id":212,"name":"Tokelau"},{"id":216,"name":"Tonga"},{"id":218,"name":"Trinidad and Tobago"},{"id":215,"name":"Tunisia"},{"id":217,"name":"Turkey"},{"id":214,"name":"Turkmenistan"},{"id":206,"name":"Turks and Caicos Islands"},{"id":219,"name":"Tuvalu"},{"id":223,"name":"Uganda"},{"id":222,"name":"Ukraine"},{"id":2,"name":"United Arab Emirates"},{"id":77,"name":"United Kingdom"},{"id":224,"name":"United States Minor Outlying Islands"},{"id":226,"name":"Uruguay"},{"id":225,"name":"USA"},{"id":227,"name":"Uzbekistan"},{"id":234,"name":"Vanuatu"},{"id":228,"name":"Vatican City (Holy See)"},{"id":230,"name":"Venezuela"},{"id":233,"name":"Vietnam"},{"id":231,"name":"Virgin Islands (British)"},{"id":232,"name":"Virgin Islands (U.S.)"},{"id":235,"name":"Wallis and Futuna"},{"id":65,"name":"Western Sahara"},{"id":237,"name":"Yemen"},{"id":241,"name":"Zaire"},{"id":240,"name":"Zambia"},{"id":242,"name":"Zimbabwe"}];
+    var gdprCountriesIds = [196,194,191,184,179,174,161,148,132,131,130,108,101,99,97,88,77,75,70,67,63,58,56,55,54,37,23,21,14];
+</script>
+
+        
+
+
+
+
+
+
+
+    <section data-nosnippet class="section container subscribe-box hidden">
+        <div class="container__inner">
+            <div class="actions">
+                <div class="actions__left">
+                    <h2>InfoQ Software Architects' Newsletter</h2>
+                    <span><p>A monthly overview of things you need to know as an architect or aspiring architect.</p>
+
+<p><a href="https://www.infoq.com/software-architects-newsletter#placeholderPastIssues">View an example</a></p>
+</span>
+                    <div class="newsletter__subscribe">
+                        <form class="form gdpr" name="dataCollectCampaignNewsletterForm" id="dataCollectCampaignNewsletterForm" action="#" onsubmit="dataCollectNewsletter.saveSubscription(); return false;">
+                            <div class="field newsletter__mail input__text input__no-label input__medium email">
+                                <label for="email-dataCollectnewsletter-infoq" class="label field__label">Enter your e-mail address</label>
+                                <input id="email-dataCollectnewsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/>
+                                <input type="text" name="emailH" id="input_email_h_d" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/>
+                                <input type="hidden" id="fnt_d" name="fnt_d" value="nRxqwtCq9cL9K39j"/>
+                                <input type="hidden" id="dataCollectNewsletterType" name="dataCollectNewsletterType" value="regular"/>
+                                <input type="hidden" id="cmpi_d" name="cmpi_d" value="4"/>
+                            </div>
+                            <div class="hidden">
+                    <span class="input__select field country">
+                        <label for="input-dataCollect-newsletter-country" class="label field__label">Select your country</label>
+                        <select id="input-dataCollect-newsletter-country" class="select field__input">
+                            <option value="" class="select__option">Select a country</option>
+                        </select>
+                        <p class="input__message field__desc"></p>
+                    </span>
+                                <span class="input__checkbox field hidden">
+                        <input type="checkbox" id="gdpr-consent-campaign">
+                        <label for="gdpr-consent-campaign" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label>
+                    </span>
+                            </div>
+                            <input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return dataCollectNewsletter.validateEmail('Invalid email address');"/>
+                        </form>
+                        <p class="meta">
+                            <a href="/privacy-notice/" target="_blank">We protect your privacy.</a>
+                        </p>
+                        
+                        <span class="success" style="display:none;" id="dataCollectNewsletterMessage"></span>
+                    </div>
+
+                </div>
+                <div class="actions__right">
+                    <button aria-label="Close" class="close closeBox button button__unstyled button__icon icon icon__close-black icon--only">Close</button>
+                </div>
+            </div>
+        </div>
+    </section>
+    <script type="text/javascript">
+        var dataCollectNewsletter = new Newsletter('Enter your e-mail address',
+                'email-dataCollectnewsletter-infoq', 'dataCollectNewsletterType','dataCollectNewsletterMessage', 'fnt_d', 'input_email_h_d', 'input-dataCollect-newsletter-country', 'cmpi_d','popup_all_pages');
+    </script>
+
+
+        
+
+
+
+
+
+
+
+ 
+
+
+        
+        <div class="infoq" id="infoq">
+            
+                <!--	#######		SITE START	#########	 -->
+                
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+
+
+
+
+
+
+
+
+
+<header class="header">
+    <button aria-label="Toggle Navigation" tabindex="0" class="burger header__toggle button">Toggle Navigation <span></span><span></span><span></span></button>
+    <div class="header__container container">
+        <div class="container__inner">
+            <div data-nosnippet class="actions header__top">
+                <div class="actions__left">
+                    <p class="header__desc my-0">
+                        Facilitating the Spread of Knowledge and Innovation in Professional Software Development
+                    </p>
+                    <div class="button__dropdown dropdown header__more my-0 dropdown__center">
+                        
+
+
+
+
+
+
+
+<button aria-label="English edition" class="button button__unstyled button__small">English edition </button>
+<div class="dropdown__holder">
+	<!---->
+	<div class="dropdown__content">
+		<ul class="no-style dropdown__nav languagesEdition">
+			<li class="active"><a href="#" onclick="return false;">English edition</a></li>
+			<li><a href="https://www.infoq.cn">Chinese edition</a></li>
+			<li><a href="/jp/">Japanese edition</a></li>
+			<li><a href="/fr/">French edition</a></li>
+		</ul>
+	</div>
+	<!---->
+</div>
+                    </div>
+                    <a class="my-0 contribute-link" role="button" href="/write-for-infoq/" title="Write for InfoQ">
+                        Write for InfoQ
+                    </a>
+                </div>
+                <div class="actions__right">
+                    <div>
+                        <form id="searchForm" name="search-form" action="/search.action" enctype="multipart/form-data" class="search icon__search icon icon__green">
+                            <div class="field search__bar input__text input__no-label input__small">
+                                <label for="search" class="label field__label">Search</label>
+                                <input name="queryString" type="text" id="search" value="" placeholder="Search" class="input field__input">
+                                <input type="hidden" name="page" value="1"/>
+                                <input type="hidden" size="15" name="searchOrder">
+                            </div>
+                            <input value="Search" type="submit" class="search__go">
+                        </form>
+                    </div>
+                    
+
+
+
+
+
+
+
+
+	<div class="action_button__group">
+		<a href="/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__green button__small">Register</a>
+		<a href="/social/keycloakLogin.action?fl=login"  onclick="return UserActions_Login.addLoginInfo(this);" class="button button__small button__outline">Sign in</a>
+	</div>
+	
+	<div class="modal_auth_required">
+		<div class="modal_auth_required__actions">
+			<h2 class="h2">Unlock the full InfoQ experience</h2>
+			<p>Unlock the full InfoQ experience by logging in! Stay updated with your favorite authors and topics, engage with content, and download exclusive resources.</p>
+			<a href="/social/keycloakLogin.action?fl=login"  onclick="return UserActions_Login.addLoginInfo(this);" class="button button__has-transition">Log In</a>
+			<div class="separator"><span>or</span></div>
+			<h3 class="h3">Don't have an InfoQ account?</h3>
+			<a href="/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button__outline button__has-transition">Register</a>
+		</div>
+		<div class="modal_auth_required__content">
+			<ul class="newsletter__features">
+				<li><strong>Stay updated on topics and peers that matter to you</strong>Receive instant alerts on the latest insights and trends.</li>
+				<li><strong>Quickly access free resources for continuous learning</strong>Minibooks, videos with transcripts, and training materials.</li>
+				<li><strong>Save articles and read at anytime</strong>Bookmark articles to read whenever youre ready.</li>
+			</ul>
+		</div>
+		<form id="login-form" data-vv-scope="login" class="login__form form" action="#" data-gtm-form-interact-id="0">
+			<input type="hidden" id="loginWidgetOrigin" name="loginWidgetOrigin" value="mainLogin">
+			<input type="hidden" name="fromP13N" id="isP13n" value="">
+			<input type="hidden" name="fromP13NId" id="p13n-id" value="">
+			<input type="hidden" name="fromP13NType" id="p13n-type" value="">
+		</form>
+	</div>
+
+
+                    
+                </div>
+            </div>
+            <div class="header__middle">
+                <div class="logo header__logo">
+                    <a href="/"  class="logo__symbol active">
+                        Logo - Back to homepage
+                    </a>
+                </div>
+                
+                <div class="content-items">
+                    <a href="/news/" class="icon icon__news">News</a>
+                    <a href="/articles/" class="icon icon__articles">Articles</a>
+                    <a href="/presentations/" class="icon icon__presentations">Presentations</a>
+                    <a href="/podcasts/" class="icon icon__podcasts">Podcasts</a>
+                    <a href="/minibooks/" class="icon icon__guides">Guides</a>
+                </div>
+                <div class="header__items columns">
+
+                    
+                        
+                        
+                        
+                        
+                        
+                        
+                    
+
+
+
+
+
+
+
+<div>
+    <h3 class="widget__heading">Topics</h3>
+    <nav class="nav header__nav topics" data-trk-ref="header_personas">
+        <div class="has--subnav li-nav">
+            <a href="/development/" title="Development" class="nav__category">Development</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/java/" title="Java">Java</a></li>
+                    <li><a href="/kotlin/" title="Kotlin">Kotlin</a></li>
+                    <li><a href="/dotnet/" title=".Net">.Net</a></li>
+                    <li><a href="/c_sharp/" title="C#">C#</a></li>
+                    <li><a href="/swift/" title="Swift">Swift</a></li>
+                    <li><a href="/golang/" title="Go">Go</a></li>
+                    <li><a href="/rust/" title="Rust">Rust</a></li>
+                    <li><a href="/javascript/" title="JavaScript">JavaScript</a></li>
+                </ul>
+                <div class="subnav__content" data-id="6815">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  Development</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/tech-hype-cycles-architectural-tradeoffs">The Free-Lunch Guide to Idea Circularity</a>
+                </h4>
+                <p class="card__excerpt">Holly Cummins discusses why &quot;nothing is new under the sun&quot; in tech. She maps historical architectural tradeoffs to modern cloud, microservices, and AI hype cycles. She connects financial debt (post-ZIRP) and technical debt to epistemic and sleep debt, showing engineering leaders how to navigate shifts in assumptions, embrace sustainability, and revive proven engineering disciplines.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/tech-hype-cycles-architectural-tradeoffs" class="card__header">
+                    <img loading="lazy" alt="The Free-Lunch Guide to Idea Circularity" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/tech-hype-cycles-architectural-tradeoffs/en/smallimage/holly-cummins-thumbnail-1783578321356.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/development/" class="button__more button button__large button__arrow arrow__right">All in  development</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/architecture-design/" title="Architecture &amp; Design" class="nav__category">Architecture &amp; Design</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/architecture/" title="Architecture">Architecture</a></li>
+                    
+                    <li><a href="/enterprise-architecture/" title="Enterprise Architecture">Enterprise Architecture</a></li>
+                    <li><a href="/performance-scalability/" title="Scalability/Performance">Scalability/Performance</a></li>
+                    <li><a href="/design/" title="Design">Design</a></li>
+                    <li><a href="/Case_Study/" title="Case Studies">Case Studies</a></li>
+                    <li><a href="/microservices/" title="Microservices">Microservices</a></li>
+                    <li><a href="/servicemesh/" title="Service Mesh">Service Mesh</a></li>
+                    <li><a href="/DesignPattern/" title="Patterns">Patterns</a></li>
+                    <li><a href="/Security/" title="Security">Security</a></li>
+                </ul>
+                <div class="subnav__content" data-id="6816">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  Architecture &amp; Design</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/valkey-architecture-patterns">From ms to &micro;s: OSS Valkey Architecture Patterns for Modern AI</a>
+                </h4>
+                <p class="card__excerpt">Dumanshu Goyal discusses optimizing data layers for low-latency workloads like AI feature stores. Drawing lessons from NASA's Space Shuttle, he explains how proxy architectures introduce hidden CPU costs, elevated tail latencies, and blast-radius risks. He demonstrates how direct-access Valkey architectures achieve microsecond latency, improve resilience, and slash infrastructure costs.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/valkey-architecture-patterns" class="card__header">
+                    <img loading="lazy" alt="From ms to &micro;s: OSS Valkey Architecture Patterns for Modern AI" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/valkey-architecture-patterns/en/smallimage/DumanshuGoyal-thumbnail-1786082640468.jpg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/architecture-design/" class="button__more button button__large button__arrow arrow__right">All in  architecture-design</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/ai-ml-data-eng/" title="AI Infrastructure" class="nav__category">AI Infrastructure</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/bigdata/" title="Big Data">Big Data</a></li>
+                    <li><a href="/machinelearning/" title="Machine Learning">Machine Learning</a></li>
+                    <li><a href="/nosql/" title="NoSQL">NoSQL</a></li>
+                    <li><a href="/database/" title="Database">Database</a></li>
+                    <li><a href="/data-analytics/" title="Data Analytics">Data Analytics</a></li>
+                    <li><a href="/streaming/" title="Streaming">Streaming</a></li>
+                </ul>
+                <div class="subnav__content" data-id="16690">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  AI, ML &amp; Data Engineering</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/openai-performance-engineering-agentic-coding">Keeping ChatGPT Fast as AI Development Accelerates</a>
+                </h4>
+                <p class="card__excerpt">Martin Spier explains how agentic workflows dramatically increase code change volume at OpenAI. He discusses the hidden systemic performance costs of rapid shipping beyond GPUs, and shares how deploying always-on AI agents automates profiling, regression detection, and continuous optimization to maintain product speed and scalability at massive global scale.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/openai-performance-engineering-agentic-coding" class="card__header">
+                    <img loading="lazy" alt="Keeping ChatGPT Fast as AI Development Accelerates" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/openai-performance-engineering-agentic-coding/en/smallimage/MartinSpier-thumbnail-1785314358072.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/ai-ml-data-eng/" class="button__more button button__large button__arrow arrow__right">All in  ai-ml-data-eng</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/culture-methods/" title="Culture &amp; Methods" class="nav__category">Culture &amp; Methods</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/agile/" title="Agile">Agile</a></li>
+                    <li><a href="/diversity/" title="Diversity">Diversity</a></li>
+                    <li><a href="/leadership/" title="Leadership">Leadership</a></li>
+                    <li><a href="/lean/" title="Lean/Kanban">Lean/Kanban</a></li>
+                    <li><a href="/personal-growth/" title="Personal Growth">Personal Growth</a></li>
+                    <li><a href="/scrum/" title="Scrum">Scrum</a></li>
+                    <li><a href="/sociocracy/" title="Sociocracy">Sociocracy</a></li>
+                    <li><a href="/software_craftsmanship/" title="Software Craftmanship">Software Craftmanship</a></li>
+                    <li><a href="/team-collaboration/" title="Team Collaboration">Team Collaboration</a></li>
+                    <li><a href="/testing/" title="Testing">Testing</a></li>
+                    <li><a href="/ux/" title="UX">UX</a></li>
+                </ul>
+                <div class="subnav__content" data-id="6817">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  Culture &amp; Methods</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/articles/culture-trends-2026">InfoQ Culture and Methods Trends Report - 2026</a>
+                </h4>
+                <p class="card__excerpt">This report summarizes how the InfoQ Culture and Methods editorial team sees the ongoing and emergent trends in the culture and methods space in 2026.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/articles/culture-trends-2026" class="card__header">
+                    <img loading="lazy" alt="InfoQ Culture and Methods Trends Report - 2026" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/culture-trends-2026/en/smallimage/infoq-trends-report-small-logo-1784644382346.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/culture-methods/" class="button__more button button__large button__arrow arrow__right">All in  culture-methods</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/devops/" class="nav__category">DevOps</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/infrastructure/" title="Infrastructure">Infrastructure</a></li>
+                    <li><a href="/continuous_delivery/" title="Continuous Delivery">Continuous Delivery</a></li>
+                    <li><a href="/automation/" title="Automation">Automation</a></li>
+                    <li><a href="/containers/" title="Containers">Containers</a></li>
+                    <li><a href="/cloud-computing/" title="Cloud">Cloud</a></li>
+                    <li><a href="/observability/" title="Observability">Observability</a></li>
+
+                </ul>
+                <div class="subnav__content" data-id="6043">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  DevOps</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/platform-engineering-product-mindset">Platform Engineering for Everyone - Success Can&rsquo;t Be Coded</a>
+                </h4>
+                <p class="card__excerpt">Max Korbacher explains why successful internal development platforms cannot be built on tech alone. He discusses the pitfalls of infrastructure-first thinking, the importance of a clear product mindset, and how to measure real value using DevEx and SPACE metrics. Learn how to align your team, manage tech debt, and foster a thriving community to ensure lasting platform adoption.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/platform-engineering-product-mindset" class="card__header">
+                    <img loading="lazy" alt="Platform Engineering for Everyone - Success Can&rsquo;t Be Coded" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/platform-engineering-product-mindset/en/smallimage/thumbnail-1784106920162.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/devops/" class="button__more button button__large button__arrow arrow__right">All in  devops</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="li-nav">
+            
+            <a rel="noreferrer noopener" href="https://events.infoq.com/" class="nav__category" title="Events" target="_blank">Events</a>
+        </div>
+    </nav>
+</div>
+
+<div>
+    <h3 class="widget__heading">Helpful links</h3>
+    <ul class="no-style header__nav">
+       <li>
+            <a href="/about-infoq" title="About InfoQ">
+                About InfoQ
+            </a>
+        </li>
+        <li>
+            <a href="/infoq-editors" title="InfoQ Editors">
+                InfoQ Editors
+            </a>
+        </li>
+        <li>
+            <a href="/write-for-infoq" title="Write for InfoQ">
+                Write for InfoQ
+            </a>
+        </li>
+        <li>
+            <a href="https://c4media.com/" target="_blank" title="About C4Media">
+                About C4Media
+            </a>
+        </li>
+        <li>
+            <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a>
+        </li>
+    </ul>
+</div>
+
+                    
+                    <div>
+                        <h3 class="widget__heading">Choose your language</h3>
+                        
+
+
+
+
+
+
+
+<ul class="language__switcher no-style">
+	<li class="active"><a href="#" onclick="return false;" title="InfoQ English">En</a></li>
+	<li><a href="https://www.infoq.cn">中文</a></li>
+	<li><a href="/jp/">日本</a></li>
+	<li><a href="/fr/">Fr</a></li>
+</ul>
+                    </div>
+                </div>
+                    
+            </div>
+            <div data-nosnippet class="actions header__bottom header__bottom__events">
+                <div class="actions__left">
+                    <div class="events-list" role="list" aria-label="Upcoming events">
+                        <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-08-26">
+                            <a class="event-card" href="https://certification.qconferences.com/ai-security-privacy?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_onlinecohortaisecurity26" target="_blank" rel="noopener noreferrer" aria-label="Online InfoQ AI Security &amp; Privacy Engineering Certification, August 26, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Aug</span><span>26,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">AI Security &amp; Privacy Engineering Certification</p>
+                                    <p class="event-description">Secure and govern production AI systems, from sensitive data to guardrails, evals, and audits.<br><strong>Online. Register now.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-09-14">
+                            <a class="event-card" href="https://certification.qconferences.com/architecture?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_onlinecohortarchitecture26" target="_blank" rel="noopener noreferrer" aria-label="Online InfoQ Architect Certification, Sep 14, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Sep</span><span>14,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">Architect Certification</p>
+                                    <p class="event-description">Distributed systems, decentralized decisions, platform engineering, and AI architecture. <br/><strong>Online. Register Now.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-08-21">
+                            <a class="event-card" href="https://certification.qconferences.com/engineering-leadership?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_onlinecohortleadership26" target="_blank" rel="noopener noreferrer" aria-label="Engineering Leadership Certification, August 21, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Aug</span><span>21,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">Engineering Leadership Certification</p>
+                                    <p class="event-description">Work through leadership decisions with senior peers facing similar technical trade-offs. <br/><strong>Online. Register Now.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2026-11-16">
+                            <a class="event-card" href="https://qconsf.com/?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_qsf26" target="_blank" rel="noopener noreferrer" aria-label="QCon San Francisco, Nov 16-20, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Nov</span><span>16-20,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">QCon San Francisco</p>
+                                    <p class="event-description">What's working across AI, architecture, and leadership, from the teams doing it. <br/><strong>Register. Early bird ends August 11.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2026-12-15">
+                            <a class="event-card" href="https://newyork.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qainy26" target="_blank" rel="noopener noreferrer" aria-label="QCon AI New York, December 15-16, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Dec</span><span>15-16,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">QCon AI New York</p>
+                                    <p class="event-description">Production AI across agents, context, evals, security, and infrastructure, from the senior engineers building it.<br/><strong>Registration open.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2027-04-13">
+                            <a class="event-card" href="https://qconlondon.com/?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_qconlondon27" target="_blank" rel="noopener noreferrer" aria-label="QCon London, April 13-16, 2027">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Apr</span><span>13-16,</span><span>2027</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">QCon London</p>
+                                    <p class="event-description">What early-adopter teams have proven in production, across 15 engineering tracks. <br/><strong> Register. Early bird ends August 11.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                    </div>
+                </div>
+                <!---->
+            </div>
+        </div>
+    </div>
+</header>
+
+            
+
+                <!--	#######		CONTENT START	#########	 -->
+                <main>
+                    
+    <div>
+        <section class="container section white">
+            <div class="container__inner">
+                <article data-type="presentation" class="article grid  ">
+                    
+
+
+
+
+
+
+<p class="crumbs">
+	<span data-nosnippet><a href="/" title="InfoQ Homepage">InfoQ Homepage</a></span>
+	
+		
+			
+			
+                <span data-nosnippet><a href="/presentations" title="Presentations">Presentations</a></span>
+            
+		
+		<span data-nosnippet class="active">FRP in ClojureScript with Javelin</span>
+	
+	
+    
+        
+    
+</p>
+
+                    
+
+
+
+
+
+
+
+                    
+
+
+
+
+
+
+
+
+
+
+                    <h1>FRP in ClojureScript with Javelin</h1>
+
+                    <div class="article__actions">
+                        
+
+
+
+
+
+
+    <div class="actions__left actions__sidebar article__actions">
+        
+        <button id="toggleLikeContent" class="icon button button__icon like button__gray icon__like" aria-label="Like">Like</button>
+        
+
+
+
+
+
+
+   
+   <div class="bookmarkReading">
+        <button id="bookmarkBtn" data-ref="bookmarkPage" aria-label="Read later" class="login button__gray button button__icon icon icon__bookmark icon--only"> </button>
+      <!-- new dropdown rading list -->
+      <div class="my-0 button__dropdown dropdown reading_list dropdown__center" id="showBookmarks">
+         <button aria-label="Reading list" class="button button__unstyled button__small"></button>
+         <div class="dropdown__holder">
+            <div class="dropdown__content">
+               <ul class="no-style dropdown__nav">
+                  <li class="active"><a href="/showbookmarks.action">Reading list</a></li>
+               </ul>
+            </div>
+         </div>
+      </div>
+      
+      <div id="toastContainer" class="toast-none toast-hide">
+          <div class="toast"><span></span></div>
+      </div>
+   </div>
+   
+
+<script type="text/javascript">
+        
+        if(loggedIn){
+                $('#showBookmarks').css('display', 'flex');
+        }
+        
+        function performBookmark() {
+                Bookmarks.toggleBookmark('presentations', 'ClojureScript-Javelin');
+        }
+        
+        infoq.event.on('bookmarkRequested', function(e) {
+                Bookmarks.toggleBookmark('presentations', 'ClojureScript-Javelin');
+        });
+        
+        infoq.event.on("loaded", function(){
+                if(loggedIn){
+                        var href = window.location.href;
+                        if(href.indexOf("#bookmarkPage") != -1){
+                                $('#bookmarkBtn').click();
+                        }
+                }
+        });
+        
+        $(document).ready(function() {
+                if(Bookmarks.isContentBookmarked == 'true'){
+                        $('#bookmarkBtn').addClass('button__green');
+                        $('#bookmarkBtn').removeClass('button__gray');
+                }else{
+                        $('#bookmarkBtn').removeClass('button__green');
+                        $('#bookmarkBtn').addClass('button__gray');
+                }
+        });
+</script>
+
+    </div>
+                    </div>
+
+                    
+
+                    <div class="presentation__switch">
+                        <label class="label">View Presentation</label>
+                        <ul class="no-style">
+                            <li><button class="button button__unstyled button__tooltip tooltip__top button__icon icon icon__pres-2-cols icon--only active" aria-label="Vertical" data-tip="Vertical" data-tip-placement="top" data-key="pres-2-cols">Vertical</button></li>
+                            <li><button class="button button__unstyled button__tooltip tooltip__top button__icon icon icon__pres-1-col icon--only" aria-label="Horizontal" data-tip="Horizontal" data-tip-placement="top" data-key="pres-1-col">Horizontal</button></li>
+                            <li><button class="button button__unstyled button__tooltip tooltip__top button__icon icon icon__pres-fs icon--only" aria-label="Full" data-tip="Full" data-tip-placement="top" data-key="pres-fs">Full</button></li>
+                        </ul>
+                    </div>
+                    <div class="speed">
+                        <label class="label">Speed:</label>
+                        <ul id="presentation_speed" class="no-style presentation_speed">
+                            <li><button class="button button__unstyled active" aria-label="1x" onclick="P.adjustSpeed(1.0, $(this));return false;">1x</button></li>
+                            <li><button class="button button__unstyled" aria-label="1.25x" onclick="P.adjustSpeed(1.25, $(this));return false;">1.25x</button></li>
+                            <li><button class="button button__unstyled" aria-label="1.5x" onclick="P.adjustSpeed(1.5, $(this));return false;">1.5x</button></li>
+                            <li><button class="button button__unstyled" aria-label="2x" onclick="P.adjustSpeed(2.0, $(this));return false;">2x</button></li>
+                        </ul>
+                    </div>
+
+                    <div class="player">
+                        <div id="player">
+                            
+                                <script type="text/javascript">
+                                    SlideSynchronizer.setTimes(TIMES);
+                                    SlideSynchronizer.playerId="video";
+                                </script>
+                                <video id="video" playsinline controls controlsList="nodownload" width="100%" height="100%" onplay="SlideSynchronizer.start();"></video>
+                            
+                        </div>
+                        <div class="actions player__actions">
+                            <div class="actions__left">
+                                
+                                    <label class="label">Download</label>
+                                    <ul class="no-style download">
+                                        
+                                            
+                                            
+                                            <li data-ref="downloadPresentationMp3">
+                                                <button id="mp3" class="button button__unstyled download" data-type="mp3" aria-label="MP3">MP3</button>
+                                            </li>
+                                            <form method="get" action="/mp3download.action" target="_blank" id="mp3Form">
+                                                <input type="hidden" name="filename" value="presentations/infoq-13-mar-frpinclojurescript.mp3"/>
+                                            </form>
+                                        
+                                        
+                                            
+                                            
+                                                
+                                                
+                                                <li data-ref="downloadPdf">
+                                                    <button id="slides" class="button button__unstyled download" data-type="slides" aria-label="Slides">Slides</button>
+                                                </li>
+                                                <form method="get" action="/pdfdownload.action" target="_blank" id="pdfForm">
+                                                    <input type="hidden" name="filename" value="presentations/ClojureWest2013-AlanDipert-FRPinClojureScriptwithFlapjax.pdf"/>
+                                                </form>
+                                            
+                                        
+                                    </ul>
+                                
+                            </div>
+                            <div class="actions__right"><span>39:08</span></div>
+                        </div>
+                    </div>
+
+                    <div id="slideContainer" class="intro slides">
+                        <div id="slide"></div>
+                    </div>
+
+                    <div class="summary">
+                        <h2 class="heading">Summary</h2>
+                        <p>Alan Dipert introduces Javelin, a ClojureScript library, demonstrating how it can be used to express a variety of asynchronous workflows in concise and composable ways.</p>
+                    </div>
+
+                    <div data-nosnippet class="bio">
+                        <h2 class="heading">Bio</h2>
+                        <p>Alan Dipert has contributed to Clojure, ClojureScript, and several Clojure projects including Leiningen and clojure-tco. Alan is a developer at The Fresh Diet, where he builds systems for delivering fresh food to customers across North America. He lives in Durham, North Carolina, where he helps run Splat Space, the local hacker space.</p>
+                    </div>
+                    <div data-nosnippet class="about-conference">
+                        <h2 class="heading">About the conference</h2>
+                        <p>Clojure/West is the newest conference creation from Alex Miller (aka @puredanger).  Alex has been running the Strange Loop conference in St. Louis since 2009, smashing together the worlds of functional and dynamic programming languages, concurrency, distributed systems, web and mobile.  Since early 2010, Alex has also been part of a team using Clojure at Revelytix.</p>
+                    </div>
+                    
+
+                    <div class="article__content">
+                        <div class="article__data">
+                            
+                        </div>
+                        
+                        
+                        
+                        
+                            
+                                
+                                
+                                
+                                
+                                    
+                                    
+                                
+                                
+                                    
+                                
+                            
+                        
+                        
+                    </div>
+
+                    <div class="aside">
+                        <div class="recorded">
+                            <p class="meta recorded__meta">Recorded at:</p>
+                            <a href="http://clojurewest.org/">
+                                <img loading="lazy" alt="" src="https://res.infoq.com/presentations/ClojureScript-Javelin/en/promoimage/WEST.jpg">
+                            </a>
+                        </div>
+                        <p class="date">Jul 16, 2013</p>
+                        <div class="article__authors authors">
+                            <div>
+                                <p class="meta">by</p>
+                                
+
+
+
+
+
+
+
+
+
+
+
+
+
+<ul class="no-style authors">
+    
+        
+            
+        
+        <li data-id="author-Alan-Dipert">
+            <p class="meta author__bio">
+                
+                <a href="/profile/Alan-Dipert/" class="avatar author__avatar" aria-label="Alan Dipert"></a>
+                <span class="author__name">
+                    <a href="/profile/Alan-Dipert/" class="author__link">Alan Dipert</a>
+                </span>
+            </p>
+            
+        </li>
+    
+</ul>
+                            </div>
+                        </div>
+                        
+                    </div>
+
+                    
+                    
+
+
+
+
+
+
+<div class="widget article__fromTopic topics">
+    
+        <div class="widget__head related__for-topic" data-id="1" data-trk-ref="content_primary_topic">
+            <h4 class="heading related__heading">
+                
+                
+                    
+                This content is in the <a href='/java/'>Java</a> topic
+            </h4>
+        </div>
+    
+    <h5 class="heading related__inline">Related Topics:</h5>
+    <ul class="no-style topics related__topics topics__small" data-trk-ref="content_related_topic">
+         
+            
+                
+                    
+                
+                
+                <li data-id="6815">
+                    <a href="/development/" class="button related__topic button__small button__black">Development</a>
+                </li>
+            
+        
+        
+            
+                
+                    
+                
+                
+                <li data-id="4929">
+                    <a href="/Clojure/" class="button related__topic button__small button__black">Clojure</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="14627">
+                    <a href="/Clojure-West-2013/" class="button related__topic button__small button__black">Clojure/West 2013</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="7131">
+                    <a href="/ClojureScript/" class="button related__topic button__small button__black">ClojureScript</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="7236">
+                    <a href="/JVM_Langugaes/" class="button related__topic button__small button__black">JVM Languages</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="1">
+                    <a href="/java/" class="button related__topic button__small button__black">Java</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="7298">
+                    <a href="/Clojure-West/" class="button related__topic button__small button__black">Clojure/West</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="3617">
+                    <a href="/Compilers/" class="button related__topic button__small button__black">Compilers</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="6415">
+                    <a href="/Asynchronous/" class="button related__topic button__small button__black">Asynchronous Programming</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="1010">
+                    <a href="/lisp/" class="button related__topic button__small button__black">LISP</a>
+                </li>
+            
+        
+    </ul>
+</div>
+
+
+                    
+                        
+                        
+                        
+
+
+
+
+
+<script type="text/javascript">
+    createOptionalVcrs({
+         uriMapping : "presentations",
+         languageUri : "",
+         excludedVcrIds : "",
+         nativeVcrAdsEnabled : "true",
+         vcrsPosition : "2"
+    });
+
+    function createOptionalVcrs(params) {
+        if(params.nativeVcrAdsEnabled) {
+            VCR.addIdstoExcludeList(params.excludedVcrIds);
+            if(params <= 1) {
+                window.finishedVcrOptional1 = false;
+            }else if(params.vcrsPosition == 2) {
+                window.finishedVcrOptional2 = false;
+            }
+            var intervalOptional = setInterval(function() {
+                if(window.vcrsLoaded) {
+                    if((InfoQConstants.pageType == "HOMEPAGE" && (params.vcrsPosition <=1 || window.finishedRelatedVcr)) ||
+                            (InfoQConstants.pageType != "HOMEPAGE" &&
+                            (window.contentVcrFinished == true && (params.vcrsPosition == 2 || params.vcrsPosition <= 1)))) {
+                        clearInterval(intervalOptional);
+                        if(InfoQConstants.countryCode == "" || InfoQConstants.countryCode == "/br" || InfoQConstants.countryCode == "/fr") {
+                            var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 2, true, null);
+                            if(vcrs != null && vcrs.length == 2)
+                            {
+                                getOptionalElements(vcrs, params);
+                            }
+                            toggleAds(vcrs, params);
+                        } else {
+                            if(params.vcrsPosition <= 1) {
+                                window.finishedVcrOptional1 = true;
+                            } else {
+                                window.finishedVcrOptional2 = true;
+                            }
+                        }
+                    }
+                }
+
+            }, 200);
+        }
+    }
+</script>
+
+    
+        
+        <div id="vcrOptional2"
+             class="widget prsp box__border f_Ceq6VfqVEhhRZDLhUeuo box nocontent  "
+             data-place="2"  data-trk-view="true" data-trk-impr="true">
+            
+                <h3 class="widget__heading">Sponsored Content</h3>
+            
+            
+
+            <ul class="prsp__items no-style vcrs_optional_2"></ul>
+        </div>
+    
+
+                    
+
+                    
+                    
+                    
+                    
+                        
+
+
+
+
+
+
+
+<script type="text/javascript">
+    var uriMapping = "presentations";
+    var showVcr = "true";
+    var fillWithVcr = "false";
+    var sponsorshipsJson = "{&quot;links&quot;:null}";
+    var sponsoredLinks = $.parseJSON($("<div/>").html(sponsorshipsJson).text()).links;
+    var numberOfSponsoredVcrIds = sponsoredLinks != null ? sponsoredLinks.length : 0;
+
+    var maxItems = 5 - numberOfSponsoredVcrIds;
+    var displayWidget = false;
+    var intervalVcrSponsorEditorial = setInterval(function() {
+        if (window.vcrsLoaded) {
+            clearInterval(intervalVcrSponsorEditorial);
+            if(showVcr || fillWithVcr) {
+                if(fillWithVcr) {
+                    for(var index in window.vcrList) {
+                        if(VCR.isVcrSponsored(sponsoredLinks, window.vcrList[index])) {
+                            VCR.addToExcludedList(window.vcrList[index]);
+                        }
+                    }
+                }
+                var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, maxItems, false, null);
+                if (vcrs != null && vcrs.length > 0 || (sponsoredLinks != null && sponsoredLinks.length > 0)) {
+                    VCR.addToExcludedList(vcrs);
+                    getCommonElements(vcrs, uriMapping, "BOTTOM");
+                    $('.related__group').find(".rvc__list").css("display", "block");
+                    displayWidget = true;
+                } else {
+                    $('.related__group').find(".rvc__list").parent("li").remove();
+                }
+            }
+            window.contentVcrFinished = true;
+            // search for infoq.event.on("contentVcrFinished",... to see how/where it is used
+            infoq.event.trigger("contentVcrFinished");
+        }
+    }, 200);
+</script>
+<input type="hidden" name="" value="" id="cont_item_primary_topic"/>
+
+
+
+
+<script type="text/javascript">
+    $(document).ready(function() {
+        $.ajax({
+            url: "/api/recommendationlinks.action",
+            contentType: "application/x-www-form-urlencoded; charset=utf-8",
+            type: 'POST',
+            data: {
+                "primaryTopicAlias": "",
+                "topicIds": "1452,3364,2198,2676",
+                "title": "FRP in ClojureScript with Javelin",
+                "contentPath": "/presentations/ClojureScript-Javelin",
+                "language": "en"
+            },
+            success: displayRelatedEditorial,
+            async: false
+        });
+    });
+
+    function displayRelatedEditorial(data) {
+        $('.related__editorial h4').text("Related Editorial");
+        if (data && data.length > 0) {
+            if(data[0].fromEs) {
+                //change title and tracking params
+                var box_title="";
+                //replace html entity since it conflicts with style
+                box_title=box_title.replace("&amp;","&");
+                $('.related__editorial h4').text("Popular in " + box_title);
+            }
+            for (var i = 0; i < data.length; i++) {
+                if (i === 5) {
+                    break;
+                }
+                if (data[i].url.indexOf("/presentations/ClojureScript-Javelin") !== -1) {
+                    console.log("Removing the current item from list...");
+                    continue;
+                }
+                var theLinkURL = data[i].url;
+                if(!theLinkURL.endsWith("/")) {
+                    theLinkURL = theLinkURL + "/";
+                }
+                var link = $('<li><h5 class="rvc__title"><a title="" href="' + theLinkURL + '">' + data[i].title + '</a></h5></li>');
+                $('.related__editorial ul').append(link);
+            }
+            $('.related__editorial').show();
+            displayWidget = true;
+        }else{
+            $('.related__editorial').parent("li").remove();
+        }
+        
+        if(displayWidget==true){
+            $('.related__group').attr("data-cols", $('.related__group').find(">li").length);
+            $('.related__group').css("display", "flex");
+        }
+    }
+</script>
+
+<ul class="no-style related__group nocontent cards">
+    <li>
+        <div class="related__editorial">
+            <h4 class="heading">Related Editorial</h4>
+            <ul></ul>
+        </div>
+    </li>
+    <li>
+        <ul class="no-style rvc__list f_rvcbox" data-place="BOTTOM" data-trk-view="true" data-trk-impr="true"
+            
+            
+                style="display: none"
+            
+        >
+            <h4 class="heading">Related Sponsors</h4>
+            
+            <div class="f_rvcList"></div>
+            
+                
+            
+        </ul>
+    </li>
+    
+    
+    
+        
+        <li class="bg-gray is-movable">
+            <div class="related__prsp">
+                <h4 class="heading">Popular across InfoQ</h4>
+                <ul>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/typescript-7-released/" class="rvc__link">
+                                Microsoft Releases TypeScript 7.0 with a Native Go Compiler, Delivering 10x Faster Builds
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/podcasts/feature-evolution-performance-transition-endive/" class="rvc__link">
+                                WebAssembly on the JVM: Feature Evolution, Performance, and the Transition to Endive
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/java-news-roundup-jul27-2026/" class="rvc__link">
+                                Java News Roundup: OpenJDK JEPs, Jakarta EE, GraalVM, TornadoVM, Micronaut, Quarkus, JobRunr, Maven
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/vault-kubernetes-key-management/" class="rvc__link">
+                                HashiCorp Ships Public Beta of Vault Kubernetes Key Management
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/presentations/microservices-platform-team-topology/" class="rvc__link">
+                                Microservices Platforms: When Team Topologies Meets Microservices Patterns
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/vercel-ships-zero-ai/" class="rvc__link">
+                                Vercel Labs Ships Zero: a Graph-First Language Built So Agents Write the Code
+                            </a>
+                        </h5>
+                    </li>
+                    
+                </ul>
+            </div>
+        </li>
+        
+    
+</ul>
+
+                    
+                    
+                  </article>
+            </div>
+        </section>
+    </div>
+        <div id="imgPreload"></div>
+
+        <script type="text/javascript">
+            // global vars that can be used for this page, use this section to add more.
+            var contentTitle = "FRP in ClojureScript with Javelin",
+                contentPath = "/presentations/ClojureScript-Javelin",
+                contentUUID = "b6767095-4a0d-45de-ae83-c9eea5d35792",
+                authorUserCSVIds = "101760482";
+        </script>
+
+        <script type="text/javascript">
+            // needed for starting download after IDP login, processing starts after frontend modules are loaded
+            infoq.event.on("loaded", function(){
+                if(loggedIn){
+                    var href = window.location.href;
+                    if(href.indexOf("#downloadPdf") != -1){
+                        //window.location.href = href.substring(0, href.indexOf('#'));
+                        $('#slides').click();
+                    } else if(href.indexOf("#downloadPresentationMp3") != -1){
+                        //window.location.href = href.substring(0, href.indexOf('#'));
+                        $('#mp3').click();
+                    }
+                }
+            });
+            P.c(false, 'p', isWideScreen, 'https://cdn.infoq.com/statics_s1_20260729094803/styles/static/images/logo/logo_scrubber_16_9.jpg', 'https://cdn.infoq.com/statics_s1_20260729094803/styles/static/images/logo/logo_scrubber_4_3.jpg');
+            
+
+
+
+
+
+
+//wait for the player to be ready
+document.getElementById("video").addEventListener('loadeddata', function() { 
+    //check if we are requested to jump to a specific time in the video
+    var t = CommonUtils.getQueryParameterByName("t");
+    if(t !== null && t.length <= 9) {
+        SlideSynchronizer.start();
+        P.seekPlayerTime(t, true);
+    }
+}, false);
+
+        </script>
+
+    
+                </main>
+
+            
+                
+
+
+
+
+
+
+
+<footer class="footer ">
+	
+		
+		<section data-nosnippet class="section container">
+			<div class="container__inner">
+				
+					
+					
+					
+					
+					
+					
+				
+
+
+<ul data-cols="5" class="no-style columns boxes topic__boxes">
+    
+        <li class="development">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/development/">Development</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/github-npm-actions-defaults/" title="GitHub Hardens npm and Actions Defaults, Drawing Debate over Delays versus Signing">GitHub Hardens npm and Actions Defaults, Drawing Debate over Delays versus Signing</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/ponytail-agent-skill-benchmark/" title="Ponytail Agent Skill Corrects its Own Benchmark after Contributor Challenge">Ponytail Agent Skill Corrects its Own Benchmark after Contributor Challenge</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/cloudflare-meerkat-consensus/" title="Cloudflare Introduces Meerkat for Strongly Consistent Global Coordination">Cloudflare Introduces Meerkat for Strongly Consistent Global Coordination</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="architecture-design">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/architecture-design/">Architecture &amp; Design</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/instacart-blueberry-sre-ai/" title="Instacart Builds Blueberry, an AI-Powered Assistant to Help On-Call Engineers Investigate Incidents">Instacart Builds Blueberry, an AI-Powered Assistant to Help On-Call Engineers Investigate Incidents</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/presentations/valkey-architecture-patterns/" title="From ms to &amp;micro;s: OSS Valkey Architecture Patterns for Modern AI">From ms to &micro;s: OSS Valkey Architecture Patterns for Modern AI</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/jiohotstar-ad-decisioning-flow/" title="JioHotstar Explains the Distributed Engineering behind Personalized Ad Requests at Streaming Scale">JioHotstar Explains the Distributed Engineering behind Personalized Ad Requests at Streaming Scale</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="culture-methods">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/culture-methods/">Culture &amp; Methods</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/articles/culture-trends-2026/" title="InfoQ Culture and Methods Trends Report - 2026">InfoQ Culture and Methods Trends Report - 2026</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/podcasts/infoq-culture-trends-2026/" title="Culture &amp;amp; Methods Trends 2026: The Human Side of AI Engineering">Culture &amp; Methods Trends 2026: The Human Side of AI Engineering</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/platform-products-people-use/" title="From Projects to Products: Turning Platforms into Products People Use">From Projects to Products: Turning Platforms into Products People Use</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="ai-ml-data-eng">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/ai-ml-data-eng/">AI, ML &amp; Data Engineering</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/database-remediation-graph/" title="Stripe Uses Graph Search and State Machines to Automate Database Remediation">Stripe Uses Graph Search and State Machines to Automate Database Remediation</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/presentations/openai-performance-engineering-agentic-coding/" title="Keeping ChatGPT Fast as AI Development Accelerates">Keeping ChatGPT Fast as AI Development Accelerates</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/cloudflare-computer-agents/" title="Cloudflare Launches Persistent, Stateful, Computer-like Environments for Agents">Cloudflare Launches Persistent, Stateful, Computer-like Environments for Agents</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="devops">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/devops/">DevOps</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/ai-incident-response/" title="AI Is Transforming Incident Response - but the Hardest Problems May Still Belong to Humans">AI Is Transforming Incident Response - but the Hardest Problems May Still Belong to Humans</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/rootly-small-pr-agentic-ai/" title="Rootly Drops Small PR Rule as Agentic AI Changes Code Review Economics">Rootly Drops Small PR Rule as Agentic AI Changes Code Review Economics</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/pod-deployment-unit-ai-agents/" title="Pods as Workers, Not Agents: Rethinking the Deployment Unit for AI Agents on Kubernetes">Pods as Workers, Not Agents: Rethinking the Deployment Unit for AI Agents on Kubernetes</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+</ul>
+
+
+
+			</div>
+		</section>
+		<section data-nosnippet class="container section section__newsletter">
+			<div class="columns container__inner">
+				 
+
+
+
+
+
+
+
+
+
+    
+
+
+
+
+
+
+
+<div class="newsletter" data-col="1/2"
+
+	
+		
+			id="infoq-nl"
+		
+
+	
+	
+>
+	<h2 class="heading">
+		<strong>The InfoQ</strong> Newsletter
+	</h2>
+	<p class="intro">A round-up of last week&#x2019;s content on InfoQ sent out every Tuesday. Join a community of over 250,000 senior developers.
+		
+			<a target="_blank" href="https://assets.infoq.com/newsletter/regular/en/newsletter_sample/newsletter_sample.html">View an example</a>
+		
+		
+	</p>
+	<ul class="newsletter__features">
+		<li>Get a quick overview of content published on a variety of innovator and early adopter technologies</li>
+		<li>Learn what you don&#x2019;t know that you don&#x2019;t know</li>
+		<li>Stay up to date with the latest information from the topics you are interested in</li>
+	</ul>
+	<div class="newsletter__subscribe">
+		<form class="form gdpr" name="footerNewsletterForm" id="footerNewsletterForm" action="#" onsubmit="footerNewsletter.saveSubscription(); return false;">
+			<div class="field newsletter__mail input__text input__no-label input__medium email">
+				<label for="email-newsletter-infoq" class="label field__label">Enter your e-mail address</label>
+				<input id="email-newsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/>
+				<input type="text" name="emailH" id="input_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/>
+				<input type="hidden" id="fnt" name="fnt" value="nRxqwtCq9cL9K39j"/>
+				<input type="hidden" id="footerNewsletterType" name="footerNewsletterType" value="regular"/>
+				<input type="hidden" id="cmpi" name="cmpi" value="1"/>
+			</div>
+			<div class="hidden">
+				<span class="input__select field country">
+					<label for="input-simple-newsletter-country" class="label field__label">Select your country</label>
+					<select id="input-simple-newsletter-country" class="select field__input">
+						<option value="" class="select__option">Select a country</option>
+					</select>
+					<p class="input__message field__desc"></p>
+				</span>
+				<span class="input__checkbox field hidden">
+					<input type="checkbox" id="gdpr-consent-simple-nl">
+					<label for="gdpr-consent-simple-nl" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label>
+				</span>
+			</div>
+			<input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return footerNewsletter.validateEmail('Invalid email address');"/>
+		</form>
+		<p class="meta">
+			<a href="/privacy-notice/" target="_blank">We protect your privacy.</a>
+		</p>
+		
+		<span class="success" style="display:none;" id="footerNewsletterMessage"></span>
+	</div>
+	<script type="text/javascript">
+		var footerNewsletter = new Newsletter('Enter your e-mail address',
+				'email-newsletter-infoq', 'footerNewsletterType','footerNewsletterMessage', 'fnt', 'input_email_h', 'input-simple-newsletter-country', 'cmpi','footer_except_homepage');
+	</script>
+</div>
+
+
+    
+        
+        
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+    
+    <div data-col="1/2" data-bg="certification" class="event__container" style="padding-right: 20px;">
+        <a href="https://certification.qconferences.com/?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=largefooterad_onlinecohorts26" target="_blank" class="qconplus__events-slider" style="">
+            <div>
+                <div class="logo-certification"></div>
+            </div>
+            <p class="intro" style="margin-bottom: 0;color: white !important;">
+                <b>InfoQ Online Certification Programs</b>
+                <br>For Senior Engineers, Architects, and Technical Leaders
+            </p>
+            <ul style="margin-bottom: 0;">
+                <li style="color: white !important;"><b>AI Engineering</b> with Hien Luu | July 25</li>
+                <li style="color: white !important;"><b>Architect</b> with Luca Mezzalira | August 13</li>
+                <li style="color: white !important;"><b>Engineering Leadership</b> with Michelle Brush | August 21</li>
+                <li style="color: white !important;"><b>AI Security &amp; Privacy Engineering</b> with Katharine Jarmul | August 26</li>
+            </ul>
+            <br>
+            <p class="intro" style="margin-bottom: 0;color: white !important;">As your role becomes more senior, the work changes. You're no longer just implementing decisions; you're shaping the systems, trade-offs, and technical direction other teams depend on.<br>These 5-week online programs give you a structured way to work through real decisions from your current role with senior peers from other companies.</p>
+            <strong class="button button__green cta__button">RESERVE YOUR PLACE</strong>
+            <small style="color: white;"><br>Live online. 4 hours a week, for 5 weeks.</small>
+        </a>
+    </div>
+
+
+
+
+
+
+			</div>
+		</section>
+	
+	<section data-nosnippet class="section container footer__subfooter align__left">
+		<div class="container__inner columns">
+			 <div data-col="1/4" class="columns footer__links-wrap">
+				  <div class="footer__links">
+						
+
+
+
+
+
+
+
+
+<a href="/" class="nuxt-link-exact-active active" title="Home">Home</a>
+
+
+    <a href="/reginit.action" class="emphasis" title="Create account">Create account</a>
+    <button aria-label="Log In" class="login" data-ref="mainLogin">Log In</button>
+
+
+<a rel="noreferrer noopener" href="http://qconferences.com/" target="_blank" title="QCon Conferences">QCon Conferences</a>
+<a rel="noreferrer noopener" href="https://events.infoq.com/" target="_blank">Events</a>
+
+    <a href="/write-for-infoq/" title="Write for InfoQ">Write for InfoQ</a>
+    <a href="/infoq-editors/" title="InfoQ Editors">InfoQ Editors</a>
+    <a href="/about-infoq/" title="About InfoQ">About InfoQ</a>
+    <a href="https://c4media.com/" target="_blank" title="About C4Media">About C4Media</a>
+    
+        <a rel="noreferrer noopener" href="https://get.infoq.com/infoq-mediakit/" title="Media Kit" target="_blank">
+            Media Kit
+        </a>
+        <a href="https://devmarketing.c4media.com/?utm_source=infoq" title="InfoQ Developer Marketing Blog" target="_blank">InfoQ Developer Marketing Blog</a>
+    
+    <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a>
+
+				  </div>
+
+			</div>
+			<div data-col="1/4" class="events__list">
+				<h4 class="heading footer__heading">Events</h4>
+                                <ul class="qcons__list no-style">
+                                    
+
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://certification.qconferences.com/engineering-leadership?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortleadership26" target="_blank">Online InfoQ Engineering Leadership Certification</a>
+                                            </h5>
+                                            <span class="meta date">August 21, 2026</span>
+                                        </div>
+                                    </li>
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://certification.qconferences.com/ai-security-privacy?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortaisecurity26" target="_blank">Online InfoQ AI Security & Privacy Engineering Program</a>
+                                            </h5>
+                                            <span class="meta date">August 26, 2026</span>
+                                        </div>
+                                    </li>
+                                        <li><span class="icon event__type conference"></span>
+                                                <div class="qcon__detail">
+                                                        <h5 class="heading">
+                                                                <a rel="noreferrer noopener" href="https://certification.qconferences.com/architecture?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortarchitecture26" target="_blank">Online InfoQ Architect Certification</a>
+                                                        </h5>
+                                                        <span class="meta date">September 14, 2026</span>
+                                                </div>
+                                        </li>
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qsf26" target="_blank">QCon San Francisco</a>
+                                            </h5>
+                                            <span class="meta date">November 16-20, 2026</span>
+                                        </div>
+                                    </li>
+									<li><span class="icon event__type conference"></span>
+										<div class="qcon__detail">
+											<h5 class="heading">
+												<a rel="noreferrer noopener" href="https://newyork.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qainy26" target="_blank">QCon AI New York</a>
+											</h5>
+											<span class="meta date">December 15-16, 2026</span>
+										</div>
+									</li>
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qlondon27" target="_blank">QCon London 2027</a>
+                                            </h5>
+                                            <span class="meta date">April 13-16, 2027</span>
+                                        </div>
+                                    </li>
+                                </ul>
+			</div>
+			<div data-col="1/4" class="footer__social-wrap">
+				<h4 class="heading text-left footer__heading">Follow us on </h4>
+				<div class="social__links columns social__links__row">
+                            
+                                
+                                        <a href="https://www.youtube.com/infoq"><span class="icon icon__large icon__social icon__youtube"></span><div><span class="social__count">Youtube</span><span class="social__followers">232K Followers</span></div></a>
+                                        <a href="http://www.linkedin.com/company/infoq"><span class="icon icon__large icon__social icon__linkedin"></span><div><span class="social__count">Linkedin</span><span class="social__followers">26K Followers</span></div></a>
+										<a rel="noreferrer noopener" href="https://www.instagram.com/infoqdotcom/" target="_blank"><span class="icon icon__large icon__social icon__instagram"></span><div><span class="social__count">Instagram</span><span class="social__followers">New</span></div></a>
+                                        <a href="#" id="footerNewsletterRssLink"><span class="icon icon__large icon__social icon__rss"></span><div><span class="social__count">RSS</span><span class="social__followers">19K Readers</span></div></a>
+                                        <a rel="noreferrer noopener" href="http://twitter.com/infoq" target="_blank"><span class="icon icon__large icon__social icon__twitter"></span><div><span class="social__count">X</span><span class="social__followers">57.1k Followers</span></div></a>
+                                        <a rel="noreferrer noopener" href="https://www.facebook.com/InfoQ-75911537320" target="_blank"><span class="icon icon__large icon__social icon__fb"></span><div><span class="social__count">Facebook</span><span class="social__followers">21K Likes</span></div></a>
+                                        <a rel="noreferrer noopener" href="https://bsky.app/profile/infoq.com" target="_blank"><span class="icon icon__large icon__social icon__bluesky"></span><div><span class="social__count">Bluesky</span><span class="social__followers">New</span></div></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                
+                                
+                                
+                                
+				</div>
+			</div>
+            <div data-col="1/4" class="footer__stayin-wrap">
+                <h4 class="heading text-left footer__heading">Stay in the know</h4>
+                <div class="stayIn_panel_container">
+                    <a href="/podcasts/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The InfoQ Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7IndlYnAiOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" loading="lazy" width="65px" height="64px" alt="The InfoQ Podcast Logo - Stay in the know"></picture></a>
+                    <a href="/podcasts/#engineering_culture" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>Engineering Culture Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsid2VicCI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" loading="lazy" width="65px" height="64px" alt="Engineering Culture Podcast Logo - Stay in the knoww"></picture></a>
+                    <a href="/software-architects-newsletter/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The Software Architects' Newsletter</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="65px" height="64px" alt="The Software Architects' Newsletter Logo - Stay in the know"></picture></a>
+                </div>
+            </div>
+			
+		</div>
+	</section>
+	<section data-nosnippet class="container footer__bottom section white align__left">
+		<div class="container__inner columns">
+			<div data-col="2/3" class="column">
+				<div class="footer__contact contact columns">
+					
+					
+						<span data-col="1/6">
+							General Feedback
+							<a href="mailto:feedback@infoq.com">feedback@infoq.com</a>
+						</span>
+						<span data-col="1/6">
+							Advertising
+							<a href="mailto:sales@infoq.com">sales@infoq.com</a>
+						</span>
+						<span data-col="1/6">
+							Editorial
+							<a href="mailto:editors@infoq.com">editors@infoq.com</a>
+						</span>
+						<span data-col="1/6">
+							Marketing
+							<a href="mailto:marketing@infoq.com">marketing@infoq.com</a>
+						</span>
+					
+				</div>
+			</div>
+			<div class="column" data-col="1/3">
+				<p class="footer__more">
+					InfoQ.com and all content copyright &#169; 2006-2026 C4Media Inc.<br/>
+					
+						<a href="/privacy-notice" target="_blank">Privacy Notice</a>, <a href="/terms-and-conditions " target="_blank">Terms And Conditions</a>, <a href="/cookie-policy " target="_blank">Cookie Policy</a>
+					
+					
+				</p>
+			</div>
+		</div>
+	</section>
+</footer>
+                <!--	#######		SITE END	#########	 -->
+            
+        </div>
+
+
+        
+            <div class="intbt">
+                <a href="/int/bt/" title="bt">BT</a>
+            </div>
+        
+
+        
+
+
+
+
+
+<script type="text/javascript">
+  $.when(humanDetectionAsync()).then(
+      function(status) {
+          $.getScript("/scripts/__hd.ifq?hdt=nRxqwtCq9cL9K39j&ha=" + status);
+      }
+  );
+</script>
+<script type="text/javascript">
+
+    var pageFullyLoaded = false;
+    // this event is fired by frontend once all the necessary things have been done(mobile display, moving vcr boxes around when needed...)
+    infoq.event.on('loaded', function(e) {
+        pageFullyLoaded = true;
+    });
+
+    infoq.event.on('pageWidthChanged', function(e) {
+        // re-execute tracking vcr impressions when this event happens (it only happens when elements are added/removed from page)
+        // doTrackVcrImpressions takes into account the data-trk-impr="true" if =false the element was already tracked.
+        // this is needed when switching from mobile to desktop or when layout on mobile changes and desktop version is displayed. New elements become visible.
+        Tracker.safeExec(Tracker.doTrackVcrImpressions);
+
+        // these 2 need to be called also because we might be on a content page. In case we are not nothing happens
+        VCR.doTrackingCustomRightbar();
+        VCR.doTrackingCustomRightbarForPresentations()
+    });
+
+    //check to see if error page
+    if(window.device !== undefined) {
+        var intervalImpressions = setInterval(function() {
+            var shouldTrack = false;
+
+            // no vcr widgets on index pages
+            if(window.isIndexPage) {
+                if(window.sponsoredPodcastDone === undefined || window.sponsoredPodcastDone) {
+                    shouldTrack = true;
+                }
+            } else
+            //on homepage, bottom widget + 2 native widgets
+            if(InfoQConstants.pageType == "HOMEPAGE" && window.finishedVcrOptional1 && window.finishedRelatedVcr && (window.finishedVcrOptional2 === undefined || window.finishedVcrOptional2)) {
+                shouldTrack = true;
+            } else
+            // rightbar widgets + native widgets + content vcr widgets
+            if((InfoQConstants.pageType == "NEWS_PAGE" || InfoQConstants.pageType == "ARTICLE_PAGE")
+                    && ((window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) && window.contentVcrFinished)) {
+                shouldTrack = true;
+            } else if ((InfoQConstants.pageType == "PRESENTATION_PAGE")
+                    && (window.contentVcrFinished || window.contentVcrFinished  === undefined)
+                    && (window.finishedRightbarVcr || window.finishedRightbarVcr  === undefined)
+            ) {
+                shouldTrack = true;
+            } else
+            // native widgets + content widgets
+            if(window.contentVcrFinished && (window.finishedVcrOptional1 || window.finishedVcrOptional1 === undefined)
+                    && (window.finishedVcrOptional2 || window.finishedVcrOptional2 === undefined)) {
+                shouldTrack = true;
+            }
+
+            // we start tracking only after the page is fully loaded, frontend signals that they finished everything related to page display.
+            if(shouldTrack && pageFullyLoaded) {
+                clearInterval(intervalImpressions);
+                Tracker.safeExec(Tracker.doTrackVcrImpressions);
+
+                // start tracking viewable impressions also only after everything is ready
+                function callbackRouter(entries, observer) {
+                    var targets = new Array();
+                    entries.forEach(function (entry) {
+                        var target = entry.target;
+                        if (target.dataset.trkView === 'false') return;
+                        if (entry.intersectionRatio > 0) {
+                            target.dataset.trkView = false;
+                            targets.push(target);
+                        }
+                    });
+                    Tracker.doTrackViewableImpressions(targets);
+                }
+                var elementsForTrackingViewableImpressions = document.querySelectorAll('[data-trk-view="true"]')
+                var observer = new IntersectionObserver(callbackRouter, { threshold: 0.3 });
+                elementsForTrackingViewableImpressions.forEach(observer.observe.bind(observer));
+            }
+
+        }, 500);
+    }
+    $(document).ready(function () {
+        // desktop notifications widget
+        Tracker.encodeNotificationLinks($(".f_notificationWidget"));
+        // mobile notifications widget
+        Tracker.encodeNotificationLinks($(".h_notifications"));
+        // desktop notifications page
+        Tracker.encodeNotificationLinks($(".notification-page"));
+        // mobile notifications page
+        Tracker.encodeNotificationLinks($(".notifications_page"));
+    });
+</script>
+        
+
+
+
+
+
+
+<script type="text/javascript">
+    if(window.location.hash){
+        var hash = window.location.hash.substring(1);
+        if(hash == 'subscribe'){
+            $('html,body').animate({scrollTop: $('.ftxt3 > .newsletter').offset().top}, 'slow');
+        }
+    }
+</script>
+<script type="text/javascript">
+	var newsletterSubscriptionURL ='/newsletter/subscribe.action';
+	DynamicLinks.updateRssLinks('3405691582');
+
+	ContentSummary.setSelectedTab('en');
+	//when user enters the main content area show default topics in the topics bar
+	$("#content-wrapper").mouseenter(function() {	
+	        showDefaultTopics();
+	});
+	
+	
+	Bookmarks.contentTitle = "FRP in ClojureScript with Javelin";
+	Bookmarks.apiUrl = '/widgets/bookmark.action';
+    Bookmarks.isContentBookmarked = "false";
+</script>
+<script type="text/javascript"> 
+var $buoop = {vs:{i:6,f:1,o:10.1,s:1}} 
+$buoop.ol = window.onload; 
+$(document).ready(function() {
+	 try {if ($buoop.ol) $buoop.ol();}catch (e) {} 
+	 var e = document.createElement("script"); 
+	 e.setAttribute("type", "text/javascript"); 
+	 e.setAttribute("src", "https://cdn.infoq.com/statics_s1_20260729094803/scripts/lib/browser-update-org/update.js");
+	 document.body.appendChild(e); 
+});
+</script>
+        
+
+        
+            
+            <script>
+                !function(f,b,e,v,n,t,s)
+                {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
+                        n.callMethod.apply(n,arguments):n.queue.push(arguments)};
+                    if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
+                    n.queue=[];t=b.createElement(e);t.async=!0;
+                    t.src=v;s=b.getElementsByTagName(e)[0];
+                    s.parentNode.insertBefore(t,s)}(window,document,'script',
+                        'https://connect.facebook.net/en_US/fbevents.js');
+                fbq('init', '842388869148196');
+                fbq('track', 'PageView');
+            </script>
+            <noscript>
+                <img height="1" width="1" src="https://www.facebook.com/tr?id=842388869148196&ev=PageView&noscript=1"/>
+            </noscript>
+            
+        
+
+            <script type='text/javascript'>
+                try {
+                    mixpanel.track('page viewed', {
+                        'page name' : document.title,
+                        'url' : window.location.pathname
+                    });
+                }
+                catch(err) {
+                }
+            </script>
+    </body>
+</html>
+<!-- s1 -->
diff --git a/archive/techworks/items/infoq-frp-javelin/video.ffprobe.json b/archive/techworks/items/infoq-frp-javelin/video.ffprobe.json
new file mode 100644
index 0000000..60599d5
--- /dev/null
+++ b/archive/techworks/items/infoq-frp-javelin/video.ffprobe.json
@@ -0,0 +1,32 @@
+{
+    "programs": [
+
+    ],
+    "stream_groups": [
+
+    ],
+    "streams": [
+        {
+            "index": 0,
+            "codec_name": "aac",
+            "codec_type": "audio",
+            "sample_rate": "44100",
+            "channels": 2,
+            "r_frame_rate": "0/0"
+        },
+        {
+            "index": 1,
+            "codec_name": "h264",
+            "codec_type": "video",
+            "width": 320,
+            "height": 240,
+            "r_frame_rate": "30000/1001"
+        }
+    ],
+    "format": {
+        "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
+        "duration": "2348.012333",
+        "size": "108590986",
+        "bit_rate": "369984"
+    }
+}
diff --git a/archive/techworks/items/infoq-programming-with-values/audio.ffprobe.json b/archive/techworks/items/infoq-programming-with-values/audio.ffprobe.json
new file mode 100644
index 0000000..7cadbf0
--- /dev/null
+++ b/archive/techworks/items/infoq-programming-with-values/audio.ffprobe.json
@@ -0,0 +1,24 @@
+{
+    "programs": [
+
+    ],
+    "stream_groups": [
+
+    ],
+    "streams": [
+        {
+            "index": 0,
+            "codec_name": "mp3",
+            "codec_type": "audio",
+            "sample_rate": "44100",
+            "channels": 2,
+            "r_frame_rate": "0/0"
+        }
+    ],
+    "format": {
+        "format_name": "mp3",
+        "duration": "2791.139438",
+        "size": "44659255",
+        "bit_rate": "128002"
+    }
+}
diff --git a/archive/techworks/items/infoq-programming-with-values/source.headers b/archive/techworks/items/infoq-programming-with-values/source.headers
new file mode 100644
index 0000000..d2c03fe
--- /dev/null
+++ b/archive/techworks/items/infoq-programming-with-values/source.headers
@@ -0,0 +1,17 @@
+HTTP/2 200 
+date: Sun, 09 Aug 2026 20:25:53 GMT
+content-type: text/html;charset=utf-8
+server: Apache
+sniply-options: BLOCK
+x-frame-options: DENY
+x-content-type-options: nosniff
+vary: Accept-Encoding,User-Agent
+content-encoding: gzip
+cache-control: private,no-cache,no-store,must-revalidate
+pragma: no-cache
+access-control-allow-credentials: true
+accept-ranges: none
+access-control-allow-origin: https://www.infoq.com
+x-xss-protection: 1; mode=block
+content-security-policy: frame-ancestors 'self'
+
diff --git a/archive/techworks/items/infoq-programming-with-values/source.html b/archive/techworks/items/infoq-programming-with-values/source.html
new file mode 100644
index 0000000..e402d30
--- /dev/null
+++ b/archive/techworks/items/infoq-programming-with-values/source.html
@@ -0,0 +1,2592 @@
+<!DOCTYPE html>
+
+
+
+
+
+
+
+
+
+
+<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <!-- Google Optimize Anti-flicker snippet (recommended)  -->
+        <style>.async-hide { opacity: 0 !important} </style>
+        <style>.promo{background:#222528;position:fixed;z-index:1001!important;left:0;top:0;right:0;max-height:48px;min-height:48px;padding-top:0!important;padding-bottom:0!important}.promo,.promo p{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo p{font-size:.8125rem;line-height:1rem;color:#fff;margin-bottom:0;margin-top:0;margin:0 auto;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:700}@media only screen and (max-width:650px){.promo p{font-size:.6875rem}}.promo span{overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.promo a{color:#fff!important;text-decoration:underline!important}.promo a.btn{background:#d0021b;padding:7px 20px;text-decoration:none!important;font-weight:700;margin-left:10px;margin-right:10px;white-space:nowrap;border-radius:5px}@media only screen and (max-width:650px){.promo a.btn{font-size:.6875rem;padding:7px 10px}}.promo.container{padding-top:8px;padding-bottom:8px}@media only screen and (min-width:1050px){.promo.container{padding-top:0;padding-bottom:0}}.promo .actions{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.promo .actions__left{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.promo .actions__right{-ms-flex-preferred-size:40px;flex-basis:40px;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.promo.hidden{display:none}.promo.show{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.promo.show .container__inner{-webkit-box-flex:1;-ms-flex:1;flex:1}.promo.fixed{position:fixed}.promo.show+header.header{margin-top:48px}.header{background:#fff;-webkit-box-shadow:0 1px 0 #dde2e5;box-shadow:0 1px 0 #dde2e5}.header .actions__left,.header__bottom__events{max-width:100%!important;margin:0}.header .header__events-all{margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.header .header__events-all .header__event-slot{-webkit-box-flex:1;-ms-flex:1 100%;flex:1 100%;border-right:1px solid #dde2e5;margin-top:3px;margin-bottom:3px;padding-left:15px;text-align:left;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:5px;min-width:300px}.header .header__events-all .header__event-slot:hover{text-decoration:none!important}.header .header__events-all .header__event-slot img{min-width:40px;height:40px}.header .header__events-all .header__event-slot div{margin-left:10px}.header .header__events-all .header__event-slot span{font-weight:700!important;font-size:.75rem;margin-bottom:0!important;margin-top:0;display:block;line-height:1.125rem;text-align:left}.header .header__events-all .header__event-slot p{font-weight:400;font-size:.625rem;line-height:130%!important;color:#495057!important;margin:0}@media only screen and (min-width:1050px){.header .header__events-all .header__event-slot p{font-size:.625rem}}.header .header__events-all .header__event-slot:first-child{padding-left:0}.header .header__events-all .header__event-slot:last-child{padding-right:0;border-right:0}@media only screen and (min-width:1050px){.header__bottom,.header__middle,.header__top{position:relative;white-space:nowrap}}.header__top{padding:10px 0}@media only screen and (min-width:800px){.header__top{padding:5px 0}}.header__bottom{padding:5px 0;z-index:29;max-width:100%}.header__bottom a{font-size:.8125rem}.header__bottom .trending{margin-left:0;margin-right:0}.header__bottom .actions{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.header__bottom .actions__left{max-width:calc(100% + 8px)}@media only screen and (min-width:800px){.header__bottom .actions__left{max-width:calc(100% + 24px)}}.header__bottom .actions__right{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;display:none}@media only screen and (min-width:1050px){.header__bottom .actions__right{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__middle{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header__middle{-ms-flex-wrap:nowrap;flex-wrap:nowrap}}.header__top .actions__left{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center}@media only screen and (min-width:1050px){.header__top .actions__right{max-width:430px}}.no-style.header__nav li:nth-child(3){font-weight:700}.no-style.header__nav li:nth-child(3) a{color:#0e5ef1!important}.header__bottom__events::after{background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),to(#fff));background:linear-gradient(90deg,rgba(255,255,255,0) 0,#fff 100%);content:'';position:absolute;height:60px;right:10px;width:25px}@media only screen and (min-width:1050px){.header__bottom__events::after{display:none}}.contribute-link{font-weight:400;font-size:.6875rem;color:#000!important;position:relative;padding-left:10px}.contribute-link:hover{color:#00791d!important;text-decoration:none!important}.contribute-link::before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1);left:-1px}.my-0{margin-top:0!important;margin-bottom:0!important}.header__desc.my-0{margin-left:0}.header__bottom__events .actions__left{max-width:100%!important;overflow-x:scroll;-ms-overflow-style:none;scrollbar-width:none;display:block;scroll-behavior:smooth;min-width:100%}.header__bottom__events .actions__left::-webkit-scrollbar{display:none}.header__bottom__events .actions__left:-webkit-scrollbar-thumb{background:#fff}.logo{line-height:1rem}.header{position:relative;z-index:41;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.header .input:focus,.header input[type=password]:focus,.header input[type=text]:focus{border:1px solid #00791d}.header a:not(.button):not(.login__action):not(.active){text-decoration:none;color:#222}.header a:not(.button):not(.login__action):not(.active):hover{text-decoration:underline;color:#222}.header__items{display:none;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (min-width:1050px){.header__items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.header__items nav{position:relative;background:0 0;padding:0;left:0;top:0;line-height:inherit;display:block;-webkit-box-shadow:none;box-shadow:none;max-width:100%;max-height:80px}}.header__items>div{width:100%;margin-bottom:32px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column nowrap;flex-flow:column nowrap}@media only screen and (min-width:552px){.header__items>div:not(:nth-last-child(-n+2)){margin-bottom:32px}}@media only screen and (min-width:552px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/2 - (32px - 32px * 1/2));flex-basis:calc(99.7% * 1/2 - (32px - 32px * 1/2));max-width:calc(99.7% * 1/2 - (32px - 32px * 1/2));width:calc(99.7% * 1/2 - (32px - 32px * 1/2))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(2n){margin-right:0;margin-left:auto}}@media only screen and (min-width:800px) and (max-width:1050px){.header__items>div{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:calc(99.7% * 1/4 - (32px - 32px * 1/4));flex-basis:calc(99.7% * 1/4 - (32px - 32px * 1/4));max-width:calc(99.7% * 1/4 - (32px - 32px * 1/4));width:calc(99.7% * 1/4 - (32px - 32px * 1/4))}.header__items>div:nth-child(1n){margin-right:32px;margin-left:0}.header__items>div:last-child{margin-right:0}.header__items>div:nth-child(4n){margin-right:0;margin-left:auto}}@media only screen and (min-width:1050px){.header__items>div{margin-bottom:0!important;margin-right:0!important;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.header__items .language__switcher{display:none}.header__items .language__switcher .li-nav.active>a,.header__items .language__switcher>li.active>a{color:#fff!important}.header__items .language__switcher .li-nav.active>a:hover,.header__items .language__switcher>li.active>a:hover{color:#fff!important;background:#0e5ef1}.header__items .language__switcher .li-nav:hover>a,.header__items .language__switcher>li:hover>a{color:#fff}.header+main{display:block;min-height:210px;-webkit-transition:margin .15s ease;transition:margin .15s ease;margin-top:0!important}.header--hide .header+main{margin-top:50px}.header--hide .header__toggle{opacity:0;top:20px;visibility:hidden}.header--hide .header__logo{max-height:0}.header--hide .header__middle,.header--hide .header__top{max-height:0;overflow:hidden;padding-top:0;padding-bottom:0;border-color:transparent}.header--hide .header__bottom .vue-portal-target{top:3px;right:0;bottom:auto;left:auto;position:absolute}.header__middle,.header__top{-webkit-transition:all .15s ease;transition:all .15s ease}.header__middle{border-bottom:1px solid rgba(0,0,0,.1);z-index:33}.header__middle .vue-portal-target{width:100%}@media only screen and (min-width:1050px){.header__middle .vue-portal-target{display:none}}@media only screen and (min-width:1050px){.header__middle{line-height:5.75rem;text-align:left;padding:0;z-index:30}.header__middle .widget__heading{display:none}}.header__top>.actions__left{display:none}@media only screen and (min-width:1050px){.header__top>.actions__left{display:-webkit-box;display:-ms-flexbox;display:flex}}.header__top>.actions__right{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin-right:0;margin-top:0;margin-bottom:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.header__top>.actions__right .dropdown__holder{width:calc(100vw - 16px);max-height:80vh}@media only screen and (min-width:600px){.header__top>.actions__right .dropdown__holder{width:auto}}.header__top>.actions__right>*{margin:0}.header__top>.actions__right .search{display:none}@media only screen and (min-width:1050px){.header__top>.actions__right>*{display:-webkit-box;display:-ms-flexbox;display:flex;white-space:nowrap}.header__top>.actions__right .search{display:block}}.header__top .user__login{display:block}.header__top .user__login>.button,.header__top .user__login>button{border-top-right-radius:0;border-bottom-right-radius:0}@media only screen and (min-width:1050px){.header__top{position:relative;right:auto;width:100%}}.header__logo{max-width:165px;position:absolute;top:8px;overflow:hidden;-webkit-transition:all .1s ease;transition:all .1s ease;z-index:32;line-height:2.25rem;height:36px;width:100px;margin-left:50px;-ms-flex-preferred-size:190px;flex-basis:190px}@media only screen and (min-width:800px){.header__logo{top:4px}}@media only screen and (min-width:1050px){.header__logo{position:relative;top:0;overflow:visible;margin-right:20px;margin-left:0;line-height:3.125rem;height:50px}.header__logo>*{width:165px}}@media only screen and (min-width:1280px){.header__logo{margin-right:30px}}.header__desc,.header__more>button{text-transform:capitalize;color:#666;letter-spacing:0;font-size:0;font-weight:400;line-height:1.5rem;vertical-align:top;font-smoothing:antialiased;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI Variable","Segoe UI",system-ui,ui-sans-serif,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-transition:font-size .15s ease-in-out;transition:font-size .15s ease-in-out}@media only screen and (min-width:1050px){.header__desc,.header__more>button{font-size:.6875rem}}.header__desc{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;position:relative;width:auto}.header__topics{white-space:nowrap;float:right;position:relative}.header__topics *{display:inline-block;vertical-align:top}.header__topics a{font-size:.8125rem}@media only screen and (min-width:1050px){.header__topics{float:none}}.header__more{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:top}.header__more:before{left:-12px}.header__more:after,.header__more:before{content:'';width:1px;height:12px;position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background:rgba(0,0,0,.1)}.header__more:after{right:-12px}.header__more:hover{cursor:pointer;color:rgba(0,0,0,.75)}.header__user{display:inline-block;vertical-align:top;white-space:nowrap;margin-left:8px}@media only screen and (min-width:1050px){.header__user{margin-left:0}}.header__user>div{display:inline-block;vertical-align:top}.header__user-nav a:not(.button){text-transform:uppercase;font-size:.75rem;font-weight:600}.header__user-nav a:not(.button):not(.active){opacity:.5}.header__user-nav a:not(.button):not(.active):hover{opacity:.75}.header__user-nav a:not(.button):hover{text-decoration:none}.header__user-nav a:not(.button).active{color:#222;cursor:default;text-decoration:none}.header__user-nav a:not(.button):before{margin-right:0}.header__user-nav a:not(.button):not(:last-child){margin-right:16px}@media only screen and (min-width:1050px){.header__user-nav a:not(.button):not(:last-child){margin-right:32px}}@media only screen and (min-width:1050px){.header__user-nav+.header__topics{margin-left:56px}}.header__search{display:none;vertical-align:top;margin-right:0}@media only screen and (min-width:1050px){.header__search{display:inline-block}}.header__search,.header__user{line-height:inherit}.header__nav{border-bottom:1px solid rgba(0,0,0,.1)}@media only screen and (min-width:800px){.header__nav{border-bottom:0}}.header__nav .button{margin-left:0}.header__nav .button__more{margin-right:20px}.header__nav .li-nav,.header__nav>li{-webkit-transition:all .15s ease;transition:all .15s ease}@media only screen and (min-width:1050px){.header__nav .li-nav,.header__nav>li{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;position:static;border:none;min-height:65px}.header__nav .li-nav:hover.has--subnav .nav .li-nav,.header__nav .li-nav:hover.has--subnav .nav>li,.header__nav>li:hover.has--subnav .nav .li-nav,.header__nav>li:hover.has--subnav .nav>li{white-space:normal}.header__nav .li-nav:hover.has--subnav .nav__subnav,.header__nav>li:hover.has--subnav .nav__subnav{opacity:1;top:100%;visibility:visible;-webkit-transition-delay:.25s;transition-delay:.25s}.header__nav .li-nav:hover.has--subnav .nav__category,.header__nav>li:hover.has--subnav .nav__category{width:100%}.header__nav .li-nav:hover.has--subnav .nav__category:after,.header__nav .li-nav:hover.has--subnav .nav__category:before,.header__nav>li:hover.has--subnav .nav__category:after,.header__nav>li:hover.has--subnav .nav__category:before{-webkit-transition-delay:.25s;transition-delay:.25s;opacity:1}}@media only screen and (min-width:1080px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1280px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}@media only screen and (min-width:1338px){.header__nav .li-nav:not(:last-child),.header__nav>li:not(:last-child){margin-right:23px;margin-left:23px}}.header__nav .li-nav>a,.header__nav>li>a{font-size:.875rem;line-height:1.5rem;padding:12px 0;color:#000;display:inline-block;max-width:100%;position:relative;z-index:61;white-space:normal}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{padding:8px 0 0;font-weight:700}}.header__nav .li-nav>a:after,.header__nav .li-nav>a:before,.header__nav>li>a:after,.header__nav>li>a:before{content:'';position:absolute;bottom:-1px;left:50%;width:0;height:0;opacity:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-style:solid;border-width:0 5px 5px 5px;-webkit-transition:opacity .15s ease-in-out;transition:opacity .15s ease-in-out;border-color:transparent transparent #fff transparent}.header__nav .li-nav>a:before,.header__nav>li>a:before{left:50%;bottom:0;border-width:0 6px 6px 6px;border-color:transparent transparent #f5f7f8 transparent}@media only screen and (min-width:1050px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1rem}}@media only screen and (min-width:1800px){.header__nav .li-nav>a,.header__nav>li>a{font-size:1.125rem}}.header--open{overflow:hidden}@media only screen and (min-width:600px){.header--open{overflow:visible}}.header--open .content-items{max-height:215px;margin:12px 0 24px}.header--open .search{margin-top:16px;display:block}.header--open .header__toggle:before{z-index:10}.header--open .header__toggle>span:nth-child(1){top:50%;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.header--open .header__toggle>span:nth-child(2){opacity:0}.header--open .header__toggle>span:nth-child(3){top:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.header--open .header__items,.header--open .header__items .language__switcher{display:-webkit-box;display:-ms-flexbox;display:flex}.header--open .header__top{z-index:100;position:absolute;left:0;right:8px;background:#fff}@media only screen and (min-width:800px){.header--open .header__top{right:20px}}.header--open .header__top .search{display:none}.header--open .header__logo{z-index:101}.header--open .header__middle{padding-top:60px}.header--open .header__bottom{display:none}.header--open .header__container{max-height:90vh;overflow-x:hidden;overflow-y:auto}@media only screen and (min-width:1050px){.header--open .header__container{overflow:visible}}.header .subnav{position:absolute;-webkit-box-shadow:0 5px 25px 1px rgba(0,0,0,.15);box-shadow:0 5px 25px 1px rgba(0,0,0,.15);background:#fff;visibility:hidden;line-height:1.75rem;max-width:100%;width:100%;left:0;opacity:0;overflow:hidden;border:1px solid #f5f7f8;border-radius:2px;-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out;top:105%;z-index:60;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}.header .subnav .subnav__categories{-webkit-box-flex:0;-ms-flex:0 1 280px;flex:0 1 280px;padding:24px 0;background:#f5f7f8;margin-right:0!important}.header .subnav .subnav__categories>li{display:block;font-size:.9375rem;padding:2px 48px 2px 24px}.header .subnav .subnav__categories>li a{display:block;font-weight:700}.header .subnav .subnav__categories>li:hover{background:#e1e1e1}.header .subnav .subnav__heading{margin-bottom:20px}.header .subnav .subnav__content{position:relative;-ms-flex-item-align:start;align-self:flex-start;padding:24px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}@media only screen and (min-width:1050px){.header .subnav .subnav__content{padding-left:32px;padding-right:32px;margin:0 auto;-webkit-box-flex:1;-ms-flex:1 1 600px;flex:1 1 600px}}.header .subnav .subnav__content .heading__container{-ms-flex-preferred-size:100%;flex-basis:100%}.header .subnav .subnav__content:before{content:'';position:absolute;left:0;top:0;bottom:-100%;width:1px;background:rgba(0,0,0,.1)}.languagesEdition .active{font-weight:700}.header__more.dropdown:after{content:'';display:inline-block;vertical-align:middle;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;background-repeat:no-repeat;background-position:center;margin-bottom:2px;width:7px;height:7px;-webkit-transition:-webkit-transform .15s ease;transition:-webkit-transform .15s ease;transition:transform .15s ease;transition:transform .15s ease,-webkit-transform .15s ease;background-color:#fff!important;background-size:contain}.header__more.dropdown button{color:#000!important;margin-right:-20px;padding-right:20px;z-index:1000}.header__more.dropdown .dropdown__holder{width:165px}.header__more.dropdown .dropdown__content{padding:13px;padding-top:5px;padding-bottom:5px}.header__more.dropdown .languagesEdition li{border-bottom:1px solid #e6e6e6}.header__more.dropdown .languagesEdition li:last-child{border:0}.logo__data{display:none;color:#666;font-size:.6875rem}@media only screen and (min-width:1050px){.logo__data{display:block;line-height:.8125rem}}.container{padding-left:12px;padding-right:12px;margin:0 auto;min-width:320px;-webkit-transition:padding .15s ease-in-out;transition:padding .15s ease-in-out}@media only screen and (min-width:600px){.container{padding-left:16px;padding-right:16px}}@media only screen and (min-width:800px){.container{padding-left:20px;padding-right:20px}}@media only screen and (min-width:1250px){.container{padding-left:60px;padding-right:60px}}@media only screen and (min-width:1400px){.container{padding-left:20px;padding-right:20px}}.container.white{background:#fff}.container__inner{max-width:1290px;margin:0 auto;-webkit-transition:max-width .15s ease-out;transition:max-width .15s ease-out}.search{display:block;position:relative;z-index:33;width:100%;max-width:100%;margin:0}.search:before{position:absolute;top:50%;right:24px;-webkit-transform:translateY(-50%);transform:translateY(-50%);margin-right:0;z-index:34}.search__bar{display:block;border-radius:2px;position:relative;z-index:33}.search__bar #search{margin-bottom:0;max-width:100%;background:#fff}.search__go{top:50%;right:0;bottom:0;left:auto;position:absolute;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:32;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:36px;height:36px;line-height:2.25rem;-webkit-box-shadow:none;box-shadow:none;display:block;background:0 0;border:0;font-size:0}@media only screen and (min-width:600px){.search__go{z-index:35}}.header #search,.search__go:hover{cursor:pointer}.header #search{height:36px;position:relative;max-width:100%;background-color:#f5f7f8!important}@media only screen and (min-width:600px){.header #search{font-size:.8125rem;min-width:165px;max-width:100%;opacity:1}}.header #search:hover{cursor:auto}@media only screen and (min-width:1050px){.header #search{margin-left:auto;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0}.header #search:focus{min-width:215px}}.header #search:focus{cursor:auto}.header #search .field__desc{display:none}.header #searchForm{width:100%;margin-top:8px}.header #searchForm:before{right:8px}@media only screen and (min-width:600px){.header #searchForm{margin-top:16px}}@media only screen and (min-width:1050px){.header #searchForm{margin-top:0}}</style>
+        <script>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date;
+            h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')};
+            (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c;
+        })(window,document.documentElement,'async-hide','dataLayer',4000,
+                {'GTM-W9GJ5DL':true});</script>
+
+        <script type="text/javascript">
+            
+            var loggedIn = false;
+            if (loggedIn) {
+                var userCountryId = '';
+            }
+        </script>
+        
+
+
+
+
+
+
+<script>
+  window.dataLayer = window.dataLayer || [];
+  function gtag(){dataLayer.push(arguments);}
+
+  //CookieControl tool recomendation
+  // Call the default command before gtag.js or Tag Manager runs to
+  // adjust how the tags operate when they run. Modify the defaults
+  // per your business requirements and prior consent granted/denied, e.g.:
+  gtag('consent', 'default', {
+      'ad_storage': 'denied',
+      'ad_user_data': 'denied',
+      'ad_personalization': 'denied',
+      'analytics_storage': 'denied',
+      wait_for_update: 500
+  });
+  gtag('set', 'ads_data_redaction', true);
+  gtag('set', 'url_passthrough', true);
+
+  if((typeof loggedIn != "undefined") && loggedIn){
+      window.dataLayer.push({'logged_in': 'true'});
+  } else {
+      window.dataLayer.push({'logged_in': 'false'});
+  }
+
+  window.dataLayer.push({'show_queryz': ''});
+
+  gtag('config', 'G-VMVPD4D2JY');
+</script>
+
+<!-- Google Tag Manager -->
+<script>
+var gtmProfile="GTM-W9GJ5DL";
+(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
+new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
+j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
+'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
+})(window,document,'script','dataLayer', gtmProfile);</script>
+<!-- End Google Tag Manager -->
+
+        <title>Programming with Values in Clojure - InfoQ</title>
+        <link rel="canonical" href="https://www.infoq.com/presentations/Programming-with-Values-in-Clojure/"/>
+        <link rel="alternate" href="https://www.infoq.com/presentations/Programming-with-Values-in-Clojure/" hreflang="en"/>
+        
+
+
+
+
+
+
+
+    
+        
+        
+        
+            
+            <link rel="alternate" href="https://www.infoq.com/presentations/Programming-with-Values-in-Clojure/" hreflang="x-default" />
+        
+    
+    
+
+
+
+
+
+
+
+        
+        
+
+
+
+
+
+<meta http-equiv="pragma" content="no-cache" />
+<meta http-equiv="cache-control" content="private,no-cache,no-store,must-revalidate" />
+<meta http-equiv="expires" content="0" />
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<meta name="copyright" content="&copy; 2006 C4Media" />
+
+<meta name="google-site-verification" content="0qInQx_1WYOeIIbxnh7DnXlw1XOxNgAYakO2k4GhNnY" />
+<meta name="msapplication-TileColor" content="#ffffff"/>
+<meta name="msapplication-TileImage" content="/styles/static/images/logo/logo.jpg"/>
+<meta property="wb:webmaster" content="3eac1729a8bbe046" />
+<meta content="width=device-width,initial-scale=1" name="viewport">
+<meta http-equiv="X-UA-Compatible" content="IE=10, IE=edge">
+
+        
+        <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style.css"/>
+        <link rel="stylesheet" type="text/css" media="print" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/print.css"/>
+        <link rel="preload" type="text/css" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_en.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
+        <link rel="preload" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/icons.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
+        <link rel="preload" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_extra.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
+        <noscript>
+            <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_en.css"/>
+            <link rel="stylesheet" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/icons.css">
+            <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/style_extra.css"/>
+        </noscript>
+
+        <link rel="stylesheet" type="text/css" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/fonts/font.css"/>
+
+        <link rel="shortcut icon" href="https://cdn.infoq.com/statics_s1_20260729094803/favicon.ico" type="image/x-icon" />
+        <link rel="apple-touch-icon" href="https://cdn.infoq.com/statics_s1_20260729094803/apple-touch-icon.png"/>
+
+        <script type="text/javascript">
+        	var device='desktop';
+            var InfoQConstants = {};
+            InfoQConstants.language = 'en';
+            InfoQConstants.countryCode = '';
+            
+                
+                InfoQConstants.scp = '[redacted transient player authorization]';
+                InfoQConstants.scs = '[redacted transient player authorization]';
+                InfoQConstants.sck = '[redacted transient player authorization]';
+                InfoQConstants.scd = '.infoq.com';
+                InfoQConstants.sct = '7200';
+                
+            
+            InfoQConstants.pageUrl = (typeof window.location != 'undefined' && window.location && typeof window.location.href != 'undefined' && window.location.href) ? window.location.href : "URL_UNAVAILABLE";
+            InfoQConstants.cet='1N0V7Nci96vmB2vJ';
+            InfoQConstants.userDetectedCountryCode = '';
+            InfoQConstants.bpadb = 'Ceq6VfqVEhhRZDLhUeuo';
+        </script>
+
+        <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/combinedJs.min.js"></script>
+        <script type="text/javascript">
+            
+                var JSi18n = JSi18n || {}; // define only if not already defined
+                JSi18n.error='Error';
+                JSi18n.login_unverifiedAccount='Unverified account';
+                JSi18n.contentSummary_showPresentations_1='';
+                JSi18n.contentSummary_showPresentations_2='';
+                JSi18n.contentSummary_showPresentations_3='';
+                JSi18n.contentSummary_showInterviews_1='';
+                JSi18n.contentSummary_showInterviews_2='';
+                JSi18n.contentSummary_showInterviews_3='';
+                JSi18n.contentSummary_showMinibooks_1='';
+                JSi18n.contentSummary_showMinibooks_2='';
+                JSi18n.login_sendingRequest='Sending request ...';
+                JSi18n.bookmark_saved='<q>&nbsp;&nbsp;&nbsp;Saved&nbsp;&nbsp;&nbsp;&nbsp;</q>';
+                JSi18n.bookmark_error='<q style=color:black;>&nbsp;&nbsp;&nbsp;Error&nbsp;&nbsp;&nbsp;&nbsp;</q>';
+                JSi18n.categoryManagement_showpopup_viewAllLink_viewAllPrefix='View All';
+                JSi18n.categoryManagement_showpopup_viewAllLink_viewAllSuffix='';
+                JSi18n.categoryManagement_showpopup_includeExcludeLink_Exclude='Exclude';
+                JSi18n.categoryManagement_showpopup_includeExcludeLink_Include='Include';
+                JSi18n.login_invalid_email='Please specify a valid email';
+                JSi18n.login_email_not_found = 'No user found with that email';
+                JSi18n.content_datetime_format='MMM dd, yyyy';
+
+                // used by frontend
+                JSi18n.FE = {
+                    labels: {
+                        follow: "Follow",
+                        followTopic: "Follow Topic",
+                        unfollow: "Unfollow",
+                        unfollowTopic: "Unfollow Topic",
+                        following: "Following",
+                        followers: "Followers",
+                        like: "Like",
+                        liked: "Liked",
+                        authors: "Peers",
+                        users : "Users",
+                        topics: "Topics",
+                        hide: "Hide Item",
+                        hidden: "%s was hidden on your profile page.",
+                        undo: "Undo",
+                        showLess: "Show less",
+                        showMore: "Show more",
+                        moreAuthors: "And %s more",
+                        bookmarked: "Content Bookmarked",
+                        unbookmarked: "Content Unbookmarked",
+                        characterLimit: "Characters Remaining"
+                    }
+                }
+            
+
+
+            
+            
+                var usersInPage = JSON.parse('[{\"id\":\"62671158\",\"ref\":\"author-Monica-Beckwith\",\"url\":\"\/profile\/Monica-Beckwith\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Monica Beckwith\",\"bio\":\"\",\"followers\":1827,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/QhDv7pXEUK1sdLsYArFmnLxecH4rYhAc.jpg\"},{\"id\":\"45723890\",\"ref\":\"author-Rags-Srinivas\",\"url\":\"\/profile\/Rags-Srinivas\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Rags Srinivas\",\"bio\":\"\",\"followers\":354,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/t4nyfgw1THkp4wMZ9EZ59RGJx8Hf9Rk8.jpg\"},{\"id\":\"87551248\",\"ref\":\"author-Steef~Jan-Wiggers\",\"url\":\"\/profile\/Steef~Jan-Wiggers\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Queue Lead Editor | Domain Architect | Cloud Expert\",\"name\":\"Steef-Jan Wiggers\",\"bio\":\"\",\"followers\":887,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/BhZx03k3Hj0pZVXmTzGqItwZxtJ06oIb.jpg\"},{\"id\":\"101760482\",\"ref\":\"author-Alan-Dipert\",\"url\":\"\/profile\/Alan-Dipert\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Alan Dipert\",\"bio\":\"\",\"followers\":2,\"imgSrc\":\"\"},{\"id\":\"80977916\",\"ref\":\"author-Thomas-Betts\",\"url\":\"\/profile\/Thomas-Betts\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Laureate Application Architect at Blackbaud\",\"name\":\"Thomas Betts\",\"bio\":\"\",\"followers\":1161,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/pSqI6HrU3k9rmmVjwS34OHG0bOMYiE6a.jpg\"},{\"id\":\"72028228\",\"ref\":\"author-Sergio-De-Simone\",\"url\":\"\/profile\/Sergio-De-Simone\",\"followedByCurrentUser\":false,\"minibio\":\"\",\"name\":\"Sergio De Simone\",\"bio\":\"\",\"followers\":771,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/NovciOoQOAYWqYqRQBFo97SuMm0xbUiC.jpg\"},{\"id\":\"126467140\",\"ref\":\"author-Renato-Losio\",\"url\":\"\/profile\/Renato-Losio\",\"followedByCurrentUser\":false,\"minibio\":\"Cloud Expert | AWS Data Hero  \",\"name\":\"Renato Losio\",\"bio\":\"\",\"followers\":901,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/ptroF8HdI2vWXm0NDaKeS0JdiPxMOAra.jpg\"},{\"id\":\"126464202\",\"ref\":\"author-Johan-Janssen\",\"url\":\"\/profile\/Johan-Janssen\",\"followedByCurrentUser\":false,\"minibio\":\"Architect at ASML\",\"name\":\"Johan Janssen\",\"bio\":\"\",\"followers\":530,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/Fb4eZ0mtvMf6MhsmBIhsUVueV4xAs2FD.jpg\"},{\"id\":\"39485652\",\"ref\":\"author-Daniel-Bryant\",\"url\":\"\/profile\/Daniel-Bryant\",\"followedByCurrentUser\":false,\"minibio\":\"InfoQ News Manager | Building Platforms at Syntasso\",\"name\":\"Daniel Bryant\",\"bio\":\"\",\"followers\":2742,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/tSe5dczMaSGtRUm18VkTR2tcF4W3SogA.jpg\"},{\"id\":\"63268344\",\"ref\":\"author-Chris-Swan\",\"url\":\"\/profile\/Chris-Swan\",\"followedByCurrentUser\":false,\"minibio\":\"Engineer, Atsign\",\"name\":\"Chris Swan\",\"bio\":\"\",\"followers\":1871,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/8PE76nOujWAoCM8yqLn9Hfv2HqW3VlIP.jpg\"},{\"id\":\"4927376\",\"ref\":\"author-Karsten-Silz\",\"url\":\"\/profile\/Karsten-Silz\",\"followedByCurrentUser\":false,\"minibio\":\"Full-Stack Java Developer\",\"name\":\"Karsten Silz\",\"bio\":\"\",\"followers\":397,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/p6zmOdOcqXiRj09iiZNeDZap7f0IglQW.jpg\"},{\"id\":\"343314\",\"ref\":\"author-Jonathan-Allen\",\"url\":\"\/profile\/Jonathan-Allen\",\"followedByCurrentUser\":false,\"minibio\":\"Software Architect\",\"name\":\"Jonathan Allen\",\"bio\":\"\",\"followers\":1828,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/Wk_C09_mzwK23YkTkKMXResJv3LKUN5D.jpg\"},{\"id\":\"114725059\",\"ref\":\"author-Holly-Cummins\",\"url\":\"\/profile\/Holly-Cummins\",\"followedByCurrentUser\":false,\"minibio\":\"Senior Technical Staff Member, IBM\",\"name\":\"Holly Cummins\",\"bio\":\"\",\"followers\":607,\"imgSrc\":\"https:\/\/cdn.infoq.com\/statics_s1_20260729094803\/images\/profiles\/cRsuGlFgKyGmGfEHvafpMO63CxbrEm22.jpg\"}]');
+            
+
+            
+            
+                var topicsInPage = JSON.parse('[{\"name\":\"Architecture & Design\",\"id\":\"6816\",\"url\":\"\/architecture-design\",\"followers\":10335,\"followedByCurrentUser\":false},{\"name\":\"Clojure\",\"id\":\"4929\",\"url\":\"\/Clojure\",\"followers\":126,\"followedByCurrentUser\":false},{\"name\":\"Java\",\"id\":\"1\",\"url\":\"\/java\",\"followers\":4940,\"followedByCurrentUser\":false},{\"name\":\"Culture & Methods\",\"id\":\"6817\",\"url\":\"\/culture-methods\",\"followers\":3983,\"followedByCurrentUser\":false},{\"name\":\"Clojure\/West\",\"id\":\"7298\",\"url\":\"\/Clojure-West\",\"followers\":2,\"followedByCurrentUser\":false},{\"name\":\"Clojure\/West 2012\",\"id\":\"7299\",\"url\":\"\/Clojure-West-2012\",\"followers\":1,\"followedByCurrentUser\":false},{\"name\":\".NET Core\",\"id\":\"15683\",\"url\":\"\/Net-Core\",\"followers\":7994,\"followedByCurrentUser\":false},{\"name\":\"JVM Languages\",\"id\":\"7236\",\"url\":\"\/JVM_Langugaes\",\"followers\":64,\"followedByCurrentUser\":false},{\"name\":\"Machine Learning\",\"id\":\"5449\",\"url\":\"\/MachineLearning\",\"followers\":14681,\"followedByCurrentUser\":false},{\"name\":\"Functional Programming\",\"id\":\"362\",\"url\":\"\/fp\",\"followers\":259,\"followedByCurrentUser\":false},{\"name\":\"Microservices\",\"id\":\"15274\",\"url\":\"\/microservices\",\"followers\":22276,\"followedByCurrentUser\":false},{\"name\":\"LISP\",\"id\":\"1010\",\"url\":\"\/lisp\",\"followers\":17,\"followedByCurrentUser\":false},{\"name\":\"AI, ML & Data Engineering\",\"id\":\"16690\",\"url\":\"\/ai-ml-data-eng\",\"followers\":6022,\"followedByCurrentUser\":false},{\"name\":\"Java9\",\"id\":\"7097\",\"url\":\"\/Java9\",\"followers\":5517,\"followedByCurrentUser\":false},{\"name\":\"DevOps\",\"id\":\"6043\",\"url\":\"\/Devops\",\"followers\":5109,\"followedByCurrentUser\":false},{\"name\":\"Reactive Programming\",\"id\":\"15453\",\"url\":\"\/reactive-programming\",\"followers\":12391,\"followedByCurrentUser\":false},{\"name\":\"Development\",\"id\":\"6815\",\"url\":\"\/development\",\"followers\":4142,\"followedByCurrentUser\":false}]');
+            
+
+            var userContentLikesInPage = [];
+            var userCommentsLikesInPage = [];
+
+
+            var currentUserId = -47881837;
+        </script>
+        
+
+        
+        
+        
+            
+
+
+
+
+
+
+<!-- Latest Version -->
+<script src="https://cc.cdn.civiccomputing.com/9/cookieControl-9.x.min.js" type="text/javascript"></script>
+<script>
+    const config = {
+        apiKey: '8910ea974a96ffb6f927952b4ae9b9b0cc3e5973',
+        product: 'PRO_MULTISITE',
+
+        // general settings
+        consentCookieExpiry: 90,
+        encodeCookie: true,
+        sameSiteCookie: true, // if false, cookie set as SameSite=None;secure;
+        sameSiteValue: ';secure', // either 'Strict', 'Lax', or 'None'
+        subDomains: true,
+        initialState: 'notify',   // 'notify','top','box' require pro licence
+        notifyOnce: false,
+        setInnerHTML: true,
+
+        //layout settings
+        layout: 'slideout',
+        position: 'left',
+        theme: 'light',
+        acceptButton: true,
+        rejectButton: true,
+        closeOnGlobalChange: true,
+        closeStyle: 'icon',
+        toggleType: 'slider',
+        notifyDismissButton: true,
+        settingsStyle: 'link',
+        excludedCountries: ['US'],
+
+        /*accessibility: {
+            disableSiteScrolling: true,
+        },*/
+
+        statement: {
+            description: 'For more detailed information about the cookies we use, see our',
+            name: 'Cookie Policy',
+            url: 'https://www.infoq.com/cookie-policy',
+            updated: '01/01/2024',
+        },
+
+        // cookies starting from 'cookie_expire' are from live.infoq.com but since we use the same tool on the same domain we need to specify those too so
+        // that infoq.com cookieControl does not delete live.infoq.com cookies(also infoq.com cookies have been specified in live.infoq.com cookieControl configs)
+        necessaryCookies: ['RegUserCookie', 'UserCookie', 'IdpCookie', 'ConversionTrackingV2_','PSAdialog','*P13NWN*','topbarSurvey','__bkm','JSESSIONID','mp_','_mixpanel','CloudFront-Key-Pair-Id','CloudFront-Policy','CloudFront-Signature','cookie_expire','discount_promo_closed','discount_promo_code','discount_promo_submitted','exit_survey_popup','referrer_popup','voting_popup_*','AWSALB','AWSALBCORS','aws-waf-token'],
+
+        optionalCookies: [
+            {
+                name: 'analytics',
+                label: 'Analytics',
+                description: 'Analytical cookies help us to improve our website by collecting and reporting information on its usage.',
+                cookies: ['_ga', '_ga*', '_gid', '_gat', '__utma', '__utmt', '__utmb', '__utmc', '__utmz', '__utmv'],
+                onAccept: function(){
+                    gtag('consent', 'update', {'analytics_storage': 'granted'});
+                },
+                onRevoke: function(){
+                    gtag('consent', 'update', {'analytics_storage': 'denied'});
+                }
+            },
+            {
+                name: 'marketing',
+                label: 'Advertising',
+                description: 'We use advertising cookies to display advertisements to you for our products.',
+                onAccept: function(){
+                    gtag('consent', 'update', {'ad_storage': 'granted', 'ad_personalization': 'granted', 'ad_user_data': 'granted'});
+                },
+                onRevoke: function(){
+                    gtag('consent', 'update', {'ad_storage': 'denied', 'ad_personalization': 'denied', 'ad_user_data': 'denied'});
+                }
+            }
+        ],
+
+        text : {
+            // main preference panels
+            title: '<h3>Our use of cookies</h3>',
+            intro: 'We use necessary cookies to make our site work. Functional cookies help enhance the performance and functionality of the site. '+
+                'We\'d also like to set analytics cookies to help us improve your experience by measuring how you use the site. '+
+                'These will be set only if you accept. ',
+            acceptSettings: 'I Accept',
+            rejectSettings: 'I Do Not Accept',
+            necessaryTitle : '<h3>Necessary Cookies</h3>',
+            necessaryDescription :  'Necessary cookies enable core functionality ' +
+                'such as page navigation and access to secure areas. '+
+                'The website cannot function properly without '+
+                'these cookies, and can only be disabled by changing '+
+                'your browser preferences.',
+            closeLabel: 'Close Cookie Control',
+            cornerButton: 'Set cookie preferences',
+            // main preference panel controls
+            on: 'On',
+            off : 'Off',
+            thirdPartyTitle : 'Some cookies require your attention',
+            thirdPartyDescription : 'Consent for the following cookies could not be '+
+                'automatically revoked. Please follow the link(s) '+
+                'below to opt out manually.',
+            // notification panels (only accessible for pro licences)
+            notifyTitle : 'Your choice regarding cookies on this site',
+            notifyDescription : 'We use cookies to optimise site functionality and '+
+                'give you the best possible experience.',
+            accept : 'I Accept',
+            reject: 'I Do Not Accept',
+            settings : 'Settings',
+        },
+        branding : {
+            removeAbout: true,
+        },
+    };
+    // do not load this for local envs only. for testing on local envs remove/modify this condition
+    if(InfoQConstants.pageUrl.indexOf('local')===-1){
+        CookieControl.load( config );
+    }
+</script>
+        
+
+        
+        
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+
+
+<script type="application/ld+json">
+{
+  "@context": "http://schema.org",
+  "@type": "NewsArticle",
+  "mainEntityOfPage": {
+    "@type": "WebPage",
+    "@id": "https://www.infoq.com/presentations/Programming-with-Values-in-Clojure/"
+    },
+  "headline": "Programming with Values in Clojure",
+  "image": ["https://assets.infoq.com/resources/en/logo_scrubber_big_4_3.jpg"
+   ],
+  "datePublished": "2012-06-11T09:09:00+0000",
+  "dateModified": "2012-06-11T09:09:00+0000",
+  "author": [
+    {
+    "@type": "Person",
+    "name": "Alan Dipert",
+    "url": "https://www.infoq.com/profile/Alan-Dipert/"
+    }
+  ],
+   "publisher": {
+    "@type": "Organization",
+    "name": "InfoQ",
+    "logo": {
+      "@type": "ImageObject",
+      "url": "https://assets.infoq.com/resources/en/logo_scrubber_big_4_3.jpg"
+    }
+  },
+  "description": "Alan Dipert discusses the benefits of functional programming in Clojure, suggesting using pure functions to process values and sometimes explicit procedures for needed side effects.",
+  "video":
+  {
+   "@type": "VideoObject",
+   "name": "Programming with Values in Clojure",
+   "description": "Alan Dipert discusses the benefits of functional programming in Clojure, suggesting using pure functions to process values and sometimes explicit procedures for needed side effects.",
+   "thumbnailUrl": [
+      "https://assets.infoq.com/resources/en/logo_scrubber_big_4_3.jpg"
+   ],
+   "uploadDate": "2012-06-11T09:09:00+0000",
+   "duration": "PT46M25S",
+   "contentUrl": "https://videog.infoq.com/presentations/12-mar-valuesinclojure.mp4"
+  },
+  "isAccessibleForFree": "False",
+  "hasPart":
+  {
+    "@type": "WebPageElement",
+    "isAccessibleForFree": "False",
+    "cssSelector" : ".paywallPdf"
+  }
+}
+</script>
+
+        <meta name="ifq:pageType" content="PRESENTATION_PAGE"/>
+        <script type="text/javascript">
+            InfoQConstants.pageType = 'PRESENTATION_PAGE';
+        </script>
+        
+            
+            
+            
+
+
+
+
+
+
+
+<meta property="og:type" content="website" />
+
+
+
+
+
+
+    
+
+
+
+    
+    
+    
+    
+        <meta property="og:image" content="https://res.infoq.com/presentations/Programming-with-Values-in-Clojure/en/smallimage/Alan.JPG"/>
+    
+    
+    
+
+
+    
+    
+    
+    
+        <meta property="twitter:image" content="https://res.infoq.com/presentations/Programming-with-Values-in-Clojure/en/smallimage/Alan.JPG"/>
+    
+    
+    
+
+
+<meta property="og:title" content="Programming with Values in Clojure "/>
+<meta property="og:description" content="Alan Dipert discusses the benefits of functional programming in Clojure, suggesting using pure functions to process values and sometimes explicit procedures for needed side effects." />
+<meta property="og:site_name" content="InfoQ"/>
+<meta property="og:url" content="https://www.infoq.com/presentations/Programming-with-Values-in-Clojure/"/>
+
+<meta name="twitter:card" content="summary_large_image" />
+<meta name="twitter:title" content="Programming with Values in Clojure "/>
+<meta name="twitter:description" content="Alan Dipert discusses the benefits of functional programming in Clojure, suggesting using pure functions to process values and sometimes explicit procedures for needed side effects." />
+
+            
+            
+            
+                <link rel="image_src" href="https://res.infoq.com/presentations/Programming-with-Values-in-Clojure/en/smallimage/Alan.JPG"/>
+            
+            <meta name="keywords" content="Programming with Values in Clojure,Development,Clojure,Clojure/West 2012,JVM Languages,Java,Clojure/West,Functional Programming,LISP,"/>
+            <meta name="description" content="Alan Dipert discusses the benefits of functional programming in Clojure, suggesting using pure functions to process values and sometimes explicit procedures for needed side effects."/>
+            <meta name="tprox" content="1339405740000" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js"></script>
+        <script type="text/javascript">
+            var slides = new Array('https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/1.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/2.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/3.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/4.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/5.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/6.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/7.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/8.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/9.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/10.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/11.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/12.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/13.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/14.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/15.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/16.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/17.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/18.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/19.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/20.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/21.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/22.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/23.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/24.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/25.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/26.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/27.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/28.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/29.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/30.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/31.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/32.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/33.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/34.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/35.swf','https://imgopt.infoq.com/fit-in/1288x0/filters:quality(80)/presentations/Programming-with-Values-in-Clojure/en/slides/36.swf'),
+                TIMES = new Array(0,37,47,166,306,489,666,786,832,860,942,969,1024,1108,1261,1344,1469,1553,1598,1673,1776,1843,1954,2015,2089,2132,2164,2207,2262,2329,2363,2455,2546,2642,2683,2773,2785),
+                EXPRESSINSTALL_SWF = 'https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/flash/expressinstall.swf',
+                SVMPLAYER_SWF = 'https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/flash/svmplayer.swf',
+                isWideScreen = false,
+                // i18n text for the to full view/minimize button
+                i18nFullScreen = 'Full',
+                i18nMinimize = 'Minimize',
+                demoTimings = '';
+            var playerSplash = 'https://cdn.infoq.com/statics_s1_20260729094803/styles/static/images/logo/logo_scrubber_16_9.jpg';
+            
+            var vhf = 'cnRtcGU6Ly92aWRlb2YuaW5mb3EuY29tL2NmeC9zdC8=';
+            var jsclassref = 'cHJlc2VudGF0aW9ucy8xMi1tYXItdmFsdWVzaW5jbG9qdXJlLm1wNA==';
+        </script>
+        
+            <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/player/PlayerPresentation_mobile.js"></script>
+            <script type="text/javascript">
+                $(document).ready(function() {
+                    init();
+                 });
+            </script>
+        
+
+        <script type='text/javascript' src='https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/videoPlayercombinedJsPresentation.js'></script>
+
+        <script type='text/javascript' src='https://cdn.infoq.com/statics_s1_20260729094803/scripts/video/PresentationUI.js'></script>
+        <script type='text/javascript' src='https://cdn.infoq.com/statics_s1_20260729094803/scripts/ui/jquery.tipsy.js'></script>
+        <link rel="stylesheet" href="https://cdn.infoq.com/statics_s1_20260729094803/styles/tipsy.css" type="text/css" />
+        <script type="text/javascript">
+            P.s = 'https://videoh.infoq.com/presentations/12-mar-valuesinclojure.mp4';
+        </script>
+        <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/relatedVcr.min.js"></script>
+        <script type="application/javascript">
+            var communityIds = "2497";
+            var topicIds = "1452,2830,2768,1,2829,358,758";
+            VCR.loadAllVcrs(communityIds, topicIds);
+        </script>
+
+    
+        
+        
+        
+        <script type="text/javascript" src="https://cdn.infoq.com/statics_s1_20260729094803/scripts/infoq.js"></script>
+
+        <script type="text/javascript">
+           document.addEventListener('DOMContentLoaded', function() {
+               if (!window || !window.infoq) return
+               infoq.init()
+           })
+       </script>
+
+       <script defer data-domain="infoq.com" src="https://plausible.io/js/script.file-downloads.hash.outbound-links.pageview-props.tagged-events.js"></script>
+       <script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
+
+    </head>
+
+    <body >
+        
+
+
+
+
+
+
+<!-- Google Tag Manager (noscript) -->
+<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9GJ5DL"
+height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
+<!-- End Google Tag Manager (noscript) -->
+        
+            <div class="intbt">
+                <a href="/int/bt/" title="bt">BT</a>
+            </div>
+        
+
+        
+
+
+
+
+
+
+<script type="text/javascript">
+    var allCountries = [{"id":3,"name":"Afghanistan"},{"id":244,"name":"Åland"},{"id":6,"name":"Albania"},{"id":61,"name":"Algeria"},{"id":13,"name":"American Samoa"},{"id":1,"name":"Andorra"},{"id":9,"name":"Angola"},{"id":5,"name":"Anguilla"},{"id":11,"name":"Antarctica"},{"id":4,"name":"Antigua and Barbuda"},{"id":12,"name":"Argentina"},{"id":7,"name":"Armenia"},{"id":16,"name":"Aruba"},{"id":15,"name":"Australia"},{"id":14,"name":"Austria"},{"id":17,"name":"Azerbaijan"},{"id":31,"name":"Bahamas"},{"id":24,"name":"Bahrain"},{"id":20,"name":"Bangladesh"},{"id":19,"name":"Barbados"},{"id":35,"name":"Belarus"},{"id":21,"name":"Belgium"},{"id":36,"name":"Belize"},{"id":26,"name":"Benin"},{"id":27,"name":"Bermuda"},{"id":32,"name":"Bhutan"},{"id":29,"name":"Bolivia"},{"id":254,"name":"Bonaire, Sint Eustatius, and Saba"},{"id":18,"name":"Bosnia and Herzegovina"},{"id":34,"name":"Botswana"},{"id":33,"name":"Bouvet Island"},{"id":30,"name":"Brazil"},{"id":104,"name":"British Indian Ocean Territory"},{"id":28,"name":"Brunei Darussalam"},{"id":23,"name":"Bulgaria"},{"id":22,"name":"Burkina Faso"},{"id":25,"name":"Burundi"},{"id":114,"name":"Cambodia"},{"id":46,"name":"Cameroon"},{"id":37,"name":"Canada"},{"id":52,"name":"Cape Verde"},{"id":121,"name":"Cayman Islands"},{"id":40,"name":"Central African Republic"},{"id":207,"name":"Chad"},{"id":45,"name":"Chile"},{"id":47,"name":"China"},{"id":53,"name":"Christmas Island"},{"id":38,"name":"Cocos (Keeling) Islands"},{"id":48,"name":"Colombia"},{"id":116,"name":"Comoros"},{"id":39,"name":"Congo (Democratic Republic)"},{"id":41,"name":"Congo (People\u0027s Republic)"},{"id":44,"name":"Cook Islands"},{"id":49,"name":"Costa Rica"},{"id":43,"name":"Cote D\u0027Ivoire"},{"id":97,"name":"Croatia"},{"id":51,"name":"Cuba"},{"id":253,"name":"Curaçao"},{"id":54,"name":"Cyprus"},{"id":55,"name":"Czech Republic"},{"id":58,"name":"Denmark"},{"id":57,"name":"Djibouti"},{"id":59,"name":"Dominica"},{"id":60,"name":"Dominican Republic"},{"id":213,"name":"East Timor"},{"id":62,"name":"Ecuador"},{"id":64,"name":"Egypt"},{"id":203,"name":"El Salvador"},{"id":87,"name":"Equatorial Guinea"},{"id":66,"name":"Eritrea"},{"id":63,"name":"Estonia"},{"id":68,"name":"Ethiopia"},{"id":72,"name":"Falkland Islands (Malvinas)"},{"id":74,"name":"Faroe Islands"},{"id":71,"name":"Fiji"},{"id":70,"name":"Finland"},{"id":75,"name":"France"},{"id":80,"name":"French Guiana"},{"id":170,"name":"French Polynesia"},{"id":208,"name":"French Southern Territories"},{"id":76,"name":"Gabon"},{"id":84,"name":"Gambia"},{"id":79,"name":"Georgia"},{"id":56,"name":"Germany"},{"id":81,"name":"Ghana"},{"id":82,"name":"Gibraltar"},{"id":88,"name":"Greece"},{"id":83,"name":"Greenland"},{"id":78,"name":"Grenada"},{"id":86,"name":"Guadeloupe"},{"id":91,"name":"Guam"},{"id":90,"name":"Guatemala"},{"id":249,"name":"Guernsey"},{"id":85,"name":"Guinea"},{"id":92,"name":"Guinea-Bissau"},{"id":93,"name":"Guyana"},{"id":98,"name":"Haiti"},{"id":95,"name":"Heard Island and McDonald Islands"},{"id":96,"name":"Honduras"},{"id":94,"name":"Hong Kong"},{"id":99,"name":"Hungary"},{"id":107,"name":"Iceland"},{"id":103,"name":"India"},{"id":100,"name":"Indonesia"},{"id":106,"name":"Iran"},{"id":105,"name":"Iraq"},{"id":101,"name":"Ireland"},{"id":245,"name":"Isle of Man"},{"id":102,"name":"Israel"},{"id":108,"name":"Italy"},{"id":109,"name":"Jamaica"},{"id":111,"name":"Japan"},{"id":250,"name":"Jersey"},{"id":110,"name":"Jordan"},{"id":122,"name":"Kazakhstan"},{"id":112,"name":"Kenya"},{"id":115,"name":"Kiribati"},{"id":243,"name":"Kosovo"},{"id":120,"name":"Kuwait"},{"id":113,"name":"Kyrgyzstan"},{"id":123,"name":"Laos"},{"id":132,"name":"Latvia"},{"id":124,"name":"Lebanon"},{"id":129,"name":"Lesotho"},{"id":128,"name":"Liberia"},{"id":133,"name":"Libya"},{"id":126,"name":"Liechtenstein"},{"id":130,"name":"Lithuania"},{"id":131,"name":"Luxembourg"},{"id":143,"name":"Macau"},{"id":139,"name":"Macedonia"},{"id":137,"name":"Madagascar"},{"id":151,"name":"Malawi"},{"id":153,"name":"Malaysia"},{"id":150,"name":"Maldives"},{"id":140,"name":"Mali"},{"id":148,"name":"Malta"},{"id":138,"name":"Marshall Islands"},{"id":145,"name":"Martinique"},{"id":146,"name":"Mauritania"},{"id":149,"name":"Mauritius"},{"id":238,"name":"Mayotte"},{"id":152,"name":"Mexico"},{"id":73,"name":"Micronesia"},{"id":136,"name":"Moldova"},{"id":135,"name":"Monaco"},{"id":142,"name":"Mongolia"},{"id":246,"name":"Montenegro"},{"id":147,"name":"Montserrat"},{"id":134,"name":"Morocco"},{"id":154,"name":"Mozambique"},{"id":141,"name":"Myanmar"},{"id":155,"name":"Namibia"},{"id":164,"name":"Nauru"},{"id":163,"name":"Nepal"},{"id":161,"name":"Netherlands"},{"id":8,"name":"Netherlands Antilles"},{"id":156,"name":"New Caledonia"},{"id":166,"name":"New Zealand"},{"id":160,"name":"Nicaragua"},{"id":157,"name":"Niger"},{"id":159,"name":"Nigeria"},{"id":165,"name":"Niue"},{"id":158,"name":"Norfolk Island"},{"id":118,"name":"North Korea"},{"id":144,"name":"Northern Mariana Islands"},{"id":162,"name":"Norway"},{"id":167,"name":"Oman"},{"id":173,"name":"Pakistan"},{"id":180,"name":"Palau"},{"id":178,"name":"Palestinian Territory"},{"id":168,"name":"Panama"},{"id":171,"name":"Papua New Guinea"},{"id":181,"name":"Paraguay"},{"id":169,"name":"Peru"},{"id":172,"name":"Philippines"},{"id":176,"name":"Pitcairn"},{"id":174,"name":"Poland"},{"id":179,"name":"Portugal"},{"id":177,"name":"Puerto Rico"},{"id":182,"name":"Qatar"},{"id":183,"name":"Reunion"},{"id":184,"name":"Romania"},{"id":185,"name":"Russian Federation"},{"id":186,"name":"Rwanda"},{"id":193,"name":"Saint Helena"},{"id":117,"name":"Saint Kitts and Nevis"},{"id":125,"name":"Saint Lucia"},{"id":251,"name":"Saint Martin"},{"id":175,"name":"Saint Pierre and Miquelon"},{"id":229,"name":"Saint Vincent and the Grenadines"},{"id":247,"name":"Saint-Barthélemy"},{"id":236,"name":"Samoa"},{"id":198,"name":"San Marino"},{"id":202,"name":"Sao Tome and Principe"},{"id":187,"name":"Saudi Arabia"},{"id":199,"name":"Senegal"},{"id":248,"name":"Serbia"},{"id":189,"name":"Seychelles"},{"id":197,"name":"Sierra Leone"},{"id":192,"name":"Singapore"},{"id":252,"name":"Sint Maarten"},{"id":196,"name":"Slovakia"},{"id":194,"name":"Slovenia"},{"id":188,"name":"Solomon Islands"},{"id":200,"name":"Somalia"},{"id":239,"name":"South Africa"},{"id":89,"name":"South Georgia and the South Sandwich Islands"},{"id":119,"name":"South Korea"},{"id":255,"name":"South Sudan"},{"id":67,"name":"Spain"},{"id":127,"name":"Sri Lanka"},{"id":190,"name":"Sudan"},{"id":201,"name":"Suriname"},{"id":195,"name":"Svalbard and Jan Mayen"},{"id":205,"name":"Swaziland"},{"id":191,"name":"Sweden"},{"id":42,"name":"Switzerland"},{"id":204,"name":"Syria"},{"id":220,"name":"Taiwan"},{"id":211,"name":"Tajikistan"},{"id":221,"name":"Tanzania"},{"id":210,"name":"Thailand"},{"id":209,"name":"Togo"},{"id":212,"name":"Tokelau"},{"id":216,"name":"Tonga"},{"id":218,"name":"Trinidad and Tobago"},{"id":215,"name":"Tunisia"},{"id":217,"name":"Turkey"},{"id":214,"name":"Turkmenistan"},{"id":206,"name":"Turks and Caicos Islands"},{"id":219,"name":"Tuvalu"},{"id":223,"name":"Uganda"},{"id":222,"name":"Ukraine"},{"id":2,"name":"United Arab Emirates"},{"id":77,"name":"United Kingdom"},{"id":224,"name":"United States Minor Outlying Islands"},{"id":226,"name":"Uruguay"},{"id":225,"name":"USA"},{"id":227,"name":"Uzbekistan"},{"id":234,"name":"Vanuatu"},{"id":228,"name":"Vatican City (Holy See)"},{"id":230,"name":"Venezuela"},{"id":233,"name":"Vietnam"},{"id":231,"name":"Virgin Islands (British)"},{"id":232,"name":"Virgin Islands (U.S.)"},{"id":235,"name":"Wallis and Futuna"},{"id":65,"name":"Western Sahara"},{"id":237,"name":"Yemen"},{"id":241,"name":"Zaire"},{"id":240,"name":"Zambia"},{"id":242,"name":"Zimbabwe"}];
+    var gdprCountriesIds = [196,194,191,184,179,174,161,148,132,131,130,108,101,99,97,88,77,75,70,67,63,58,56,55,54,37,23,21,14];
+</script>
+
+        
+
+
+
+
+
+
+
+    <section data-nosnippet class="section container subscribe-box hidden">
+        <div class="container__inner">
+            <div class="actions">
+                <div class="actions__left">
+                    <h2>InfoQ Software Architects' Newsletter</h2>
+                    <span><p>A monthly overview of things you need to know as an architect or aspiring architect.</p>
+
+<p><a href="https://www.infoq.com/software-architects-newsletter#placeholderPastIssues">View an example</a></p>
+</span>
+                    <div class="newsletter__subscribe">
+                        <form class="form gdpr" name="dataCollectCampaignNewsletterForm" id="dataCollectCampaignNewsletterForm" action="#" onsubmit="dataCollectNewsletter.saveSubscription(); return false;">
+                            <div class="field newsletter__mail input__text input__no-label input__medium email">
+                                <label for="email-dataCollectnewsletter-infoq" class="label field__label">Enter your e-mail address</label>
+                                <input id="email-dataCollectnewsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/>
+                                <input type="text" name="emailH" id="input_email_h_d" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/>
+                                <input type="hidden" id="fnt_d" name="fnt_d" value="1N0V7Nci96vmB2vJ"/>
+                                <input type="hidden" id="dataCollectNewsletterType" name="dataCollectNewsletterType" value="regular"/>
+                                <input type="hidden" id="cmpi_d" name="cmpi_d" value="4"/>
+                            </div>
+                            <div class="hidden">
+                    <span class="input__select field country">
+                        <label for="input-dataCollect-newsletter-country" class="label field__label">Select your country</label>
+                        <select id="input-dataCollect-newsletter-country" class="select field__input">
+                            <option value="" class="select__option">Select a country</option>
+                        </select>
+                        <p class="input__message field__desc"></p>
+                    </span>
+                                <span class="input__checkbox field hidden">
+                        <input type="checkbox" id="gdpr-consent-campaign">
+                        <label for="gdpr-consent-campaign" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label>
+                    </span>
+                            </div>
+                            <input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return dataCollectNewsletter.validateEmail('Invalid email address');"/>
+                        </form>
+                        <p class="meta">
+                            <a href="/privacy-notice/" target="_blank">We protect your privacy.</a>
+                        </p>
+                        
+                        <span class="success" style="display:none;" id="dataCollectNewsletterMessage"></span>
+                    </div>
+
+                </div>
+                <div class="actions__right">
+                    <button aria-label="Close" class="close closeBox button button__unstyled button__icon icon icon__close-black icon--only">Close</button>
+                </div>
+            </div>
+        </div>
+    </section>
+    <script type="text/javascript">
+        var dataCollectNewsletter = new Newsletter('Enter your e-mail address',
+                'email-dataCollectnewsletter-infoq', 'dataCollectNewsletterType','dataCollectNewsletterMessage', 'fnt_d', 'input_email_h_d', 'input-dataCollect-newsletter-country', 'cmpi_d','popup_all_pages');
+    </script>
+
+
+        
+
+
+
+
+
+
+
+ 
+
+
+        
+        <div class="infoq" id="infoq">
+            
+                <!--	#######		SITE START	#########	 -->
+                
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+
+
+
+
+
+
+
+
+
+<header class="header">
+    <button aria-label="Toggle Navigation" tabindex="0" class="burger header__toggle button">Toggle Navigation <span></span><span></span><span></span></button>
+    <div class="header__container container">
+        <div class="container__inner">
+            <div data-nosnippet class="actions header__top">
+                <div class="actions__left">
+                    <p class="header__desc my-0">
+                        Facilitating the Spread of Knowledge and Innovation in Professional Software Development
+                    </p>
+                    <div class="button__dropdown dropdown header__more my-0 dropdown__center">
+                        
+
+
+
+
+
+
+
+<button aria-label="English edition" class="button button__unstyled button__small">English edition </button>
+<div class="dropdown__holder">
+	<!---->
+	<div class="dropdown__content">
+		<ul class="no-style dropdown__nav languagesEdition">
+			<li class="active"><a href="#" onclick="return false;">English edition</a></li>
+			<li><a href="https://www.infoq.cn">Chinese edition</a></li>
+			<li><a href="/jp/">Japanese edition</a></li>
+			<li><a href="/fr/">French edition</a></li>
+		</ul>
+	</div>
+	<!---->
+</div>
+                    </div>
+                    <a class="my-0 contribute-link" role="button" href="/write-for-infoq/" title="Write for InfoQ">
+                        Write for InfoQ
+                    </a>
+                </div>
+                <div class="actions__right">
+                    <div>
+                        <form id="searchForm" name="search-form" action="/search.action" enctype="multipart/form-data" class="search icon__search icon icon__green">
+                            <div class="field search__bar input__text input__no-label input__small">
+                                <label for="search" class="label field__label">Search</label>
+                                <input name="queryString" type="text" id="search" value="" placeholder="Search" class="input field__input">
+                                <input type="hidden" name="page" value="1"/>
+                                <input type="hidden" size="15" name="searchOrder">
+                            </div>
+                            <input value="Search" type="submit" class="search__go">
+                        </form>
+                    </div>
+                    
+
+
+
+
+
+
+
+
+	<div class="action_button__group">
+		<a href="/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button button__green button__small">Register</a>
+		<a href="/social/keycloakLogin.action?fl=login"  onclick="return UserActions_Login.addLoginInfo(this);" class="button button__small button__outline">Sign in</a>
+	</div>
+	
+	<div class="modal_auth_required">
+		<div class="modal_auth_required__actions">
+			<h2 class="h2">Unlock the full InfoQ experience</h2>
+			<p>Unlock the full InfoQ experience by logging in! Stay updated with your favorite authors and topics, engage with content, and download exclusive resources.</p>
+			<a href="/social/keycloakLogin.action?fl=login"  onclick="return UserActions_Login.addLoginInfo(this);" class="button button__has-transition">Log In</a>
+			<div class="separator"><span>or</span></div>
+			<h3 class="h3">Don't have an InfoQ account?</h3>
+			<a href="/reginit.action?" onclick="return UserActions_Login.addLoginInfo(this);" class="button__outline button__has-transition">Register</a>
+		</div>
+		<div class="modal_auth_required__content">
+			<ul class="newsletter__features">
+				<li><strong>Stay updated on topics and peers that matter to you</strong>Receive instant alerts on the latest insights and trends.</li>
+				<li><strong>Quickly access free resources for continuous learning</strong>Minibooks, videos with transcripts, and training materials.</li>
+				<li><strong>Save articles and read at anytime</strong>Bookmark articles to read whenever youre ready.</li>
+			</ul>
+		</div>
+		<form id="login-form" data-vv-scope="login" class="login__form form" action="#" data-gtm-form-interact-id="0">
+			<input type="hidden" id="loginWidgetOrigin" name="loginWidgetOrigin" value="mainLogin">
+			<input type="hidden" name="fromP13N" id="isP13n" value="">
+			<input type="hidden" name="fromP13NId" id="p13n-id" value="">
+			<input type="hidden" name="fromP13NType" id="p13n-type" value="">
+		</form>
+	</div>
+
+
+                    
+                </div>
+            </div>
+            <div class="header__middle">
+                <div class="logo header__logo">
+                    <a href="/"  class="logo__symbol active">
+                        Logo - Back to homepage
+                    </a>
+                </div>
+                
+                <div class="content-items">
+                    <a href="/news/" class="icon icon__news">News</a>
+                    <a href="/articles/" class="icon icon__articles">Articles</a>
+                    <a href="/presentations/" class="icon icon__presentations">Presentations</a>
+                    <a href="/podcasts/" class="icon icon__podcasts">Podcasts</a>
+                    <a href="/minibooks/" class="icon icon__guides">Guides</a>
+                </div>
+                <div class="header__items columns">
+
+                    
+                        
+                        
+                        
+                        
+                        
+                        
+                    
+
+
+
+
+
+
+
+<div>
+    <h3 class="widget__heading">Topics</h3>
+    <nav class="nav header__nav topics" data-trk-ref="header_personas">
+        <div class="has--subnav li-nav">
+            <a href="/development/" title="Development" class="nav__category">Development</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/java/" title="Java">Java</a></li>
+                    <li><a href="/kotlin/" title="Kotlin">Kotlin</a></li>
+                    <li><a href="/dotnet/" title=".Net">.Net</a></li>
+                    <li><a href="/c_sharp/" title="C#">C#</a></li>
+                    <li><a href="/swift/" title="Swift">Swift</a></li>
+                    <li><a href="/golang/" title="Go">Go</a></li>
+                    <li><a href="/rust/" title="Rust">Rust</a></li>
+                    <li><a href="/javascript/" title="JavaScript">JavaScript</a></li>
+                </ul>
+                <div class="subnav__content" data-id="6815">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  Development</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/tech-hype-cycles-architectural-tradeoffs">The Free-Lunch Guide to Idea Circularity</a>
+                </h4>
+                <p class="card__excerpt">Holly Cummins discusses why &quot;nothing is new under the sun&quot; in tech. She maps historical architectural tradeoffs to modern cloud, microservices, and AI hype cycles. She connects financial debt (post-ZIRP) and technical debt to epistemic and sleep debt, showing engineering leaders how to navigate shifts in assumptions, embrace sustainability, and revive proven engineering disciplines.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/tech-hype-cycles-architectural-tradeoffs" class="card__header">
+                    <img loading="lazy" alt="The Free-Lunch Guide to Idea Circularity" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/tech-hype-cycles-architectural-tradeoffs/en/smallimage/holly-cummins-thumbnail-1783578321356.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/development/" class="button__more button button__large button__arrow arrow__right">All in  development</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/architecture-design/" title="Architecture &amp; Design" class="nav__category">Architecture &amp; Design</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/architecture/" title="Architecture">Architecture</a></li>
+                    
+                    <li><a href="/enterprise-architecture/" title="Enterprise Architecture">Enterprise Architecture</a></li>
+                    <li><a href="/performance-scalability/" title="Scalability/Performance">Scalability/Performance</a></li>
+                    <li><a href="/design/" title="Design">Design</a></li>
+                    <li><a href="/Case_Study/" title="Case Studies">Case Studies</a></li>
+                    <li><a href="/microservices/" title="Microservices">Microservices</a></li>
+                    <li><a href="/servicemesh/" title="Service Mesh">Service Mesh</a></li>
+                    <li><a href="/DesignPattern/" title="Patterns">Patterns</a></li>
+                    <li><a href="/Security/" title="Security">Security</a></li>
+                </ul>
+                <div class="subnav__content" data-id="6816">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  Architecture &amp; Design</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/valkey-architecture-patterns">From ms to &micro;s: OSS Valkey Architecture Patterns for Modern AI</a>
+                </h4>
+                <p class="card__excerpt">Dumanshu Goyal discusses optimizing data layers for low-latency workloads like AI feature stores. Drawing lessons from NASA's Space Shuttle, he explains how proxy architectures introduce hidden CPU costs, elevated tail latencies, and blast-radius risks. He demonstrates how direct-access Valkey architectures achieve microsecond latency, improve resilience, and slash infrastructure costs.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/valkey-architecture-patterns" class="card__header">
+                    <img loading="lazy" alt="From ms to &micro;s: OSS Valkey Architecture Patterns for Modern AI" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/valkey-architecture-patterns/en/smallimage/DumanshuGoyal-thumbnail-1786082640468.jpg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/architecture-design/" class="button__more button button__large button__arrow arrow__right">All in  architecture-design</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/ai-ml-data-eng/" title="AI Infrastructure" class="nav__category">AI Infrastructure</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/bigdata/" title="Big Data">Big Data</a></li>
+                    <li><a href="/machinelearning/" title="Machine Learning">Machine Learning</a></li>
+                    <li><a href="/nosql/" title="NoSQL">NoSQL</a></li>
+                    <li><a href="/database/" title="Database">Database</a></li>
+                    <li><a href="/data-analytics/" title="Data Analytics">Data Analytics</a></li>
+                    <li><a href="/streaming/" title="Streaming">Streaming</a></li>
+                </ul>
+                <div class="subnav__content" data-id="16690">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  AI, ML &amp; Data Engineering</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/openai-performance-engineering-agentic-coding">Keeping ChatGPT Fast as AI Development Accelerates</a>
+                </h4>
+                <p class="card__excerpt">Martin Spier explains how agentic workflows dramatically increase code change volume at OpenAI. He discusses the hidden systemic performance costs of rapid shipping beyond GPUs, and shares how deploying always-on AI agents automates profiling, regression detection, and continuous optimization to maintain product speed and scalability at massive global scale.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/openai-performance-engineering-agentic-coding" class="card__header">
+                    <img loading="lazy" alt="Keeping ChatGPT Fast as AI Development Accelerates" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/openai-performance-engineering-agentic-coding/en/smallimage/MartinSpier-thumbnail-1785314358072.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/ai-ml-data-eng/" class="button__more button button__large button__arrow arrow__right">All in  ai-ml-data-eng</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/culture-methods/" title="Culture &amp; Methods" class="nav__category">Culture &amp; Methods</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/agile/" title="Agile">Agile</a></li>
+                    <li><a href="/diversity/" title="Diversity">Diversity</a></li>
+                    <li><a href="/leadership/" title="Leadership">Leadership</a></li>
+                    <li><a href="/lean/" title="Lean/Kanban">Lean/Kanban</a></li>
+                    <li><a href="/personal-growth/" title="Personal Growth">Personal Growth</a></li>
+                    <li><a href="/scrum/" title="Scrum">Scrum</a></li>
+                    <li><a href="/sociocracy/" title="Sociocracy">Sociocracy</a></li>
+                    <li><a href="/software_craftsmanship/" title="Software Craftmanship">Software Craftmanship</a></li>
+                    <li><a href="/team-collaboration/" title="Team Collaboration">Team Collaboration</a></li>
+                    <li><a href="/testing/" title="Testing">Testing</a></li>
+                    <li><a href="/ux/" title="UX">UX</a></li>
+                </ul>
+                <div class="subnav__content" data-id="6817">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  Culture &amp; Methods</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/articles/culture-trends-2026">InfoQ Culture and Methods Trends Report - 2026</a>
+                </h4>
+                <p class="card__excerpt">This report summarizes how the InfoQ Culture and Methods editorial team sees the ongoing and emergent trends in the culture and methods space in 2026.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/articles/culture-trends-2026" class="card__header">
+                    <img loading="lazy" alt="InfoQ Culture and Methods Trends Report - 2026" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/articles/culture-trends-2026/en/smallimage/infoq-trends-report-small-logo-1784644382346.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/culture-methods/" class="button__more button button__large button__arrow arrow__right">All in  culture-methods</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="has--subnav li-nav">
+            <a href="/devops/" class="nav__category">DevOps</a>
+            <div class="nav__subnav subnav">
+                <ul class="subnav__categories no-style">
+                    <li><a href="/infrastructure/" title="Infrastructure">Infrastructure</a></li>
+                    <li><a href="/continuous_delivery/" title="Continuous Delivery">Continuous Delivery</a></li>
+                    <li><a href="/automation/" title="Automation">Automation</a></li>
+                    <li><a href="/containers/" title="Containers">Containers</a></li>
+                    <li><a href="/cloud-computing/" title="Cloud">Cloud</a></li>
+                    <li><a href="/observability/" title="Observability">Observability</a></li>
+
+                </ul>
+                <div class="subnav__content" data-id="6043">
+                    
+
+
+
+
+
+
+
+
+
+<div class="heading__container actions">
+    <div class="actions__left">
+        <h3 class="heading section__heading">Featured in  DevOps</h3>
+    </div>
+</div>
+<ul data-size="large" data-horizontal="true" data-tax="" taxonomy="articles" class="cards no-style">
+    <li>
+        <div class="card__content">
+            <div class="card__data">
+                <h4 class="card__title">
+                    <a href="/presentations/platform-engineering-product-mindset">Platform Engineering for Everyone - Success Can&rsquo;t Be Coded</a>
+                </h4>
+                <p class="card__excerpt">Max Korbacher explains why successful internal development platforms cannot be built on tech alone. He discusses the pitfalls of infrastructure-first thinking, the importance of a clear product mindset, and how to measure real value using DevEx and SPACE metrics. Learn how to align your team, manage tech debt, and foster a thriving community to ensure lasting platform adoption.</p>
+                <div class="card__footer"></div>
+            </div>
+            
+                <a href="/presentations/platform-engineering-product-mindset" class="card__header">
+                    <img loading="lazy" alt="Platform Engineering for Everyone - Success Can&rsquo;t Be Coded" src="https://imgopt.infoq.com/fit-in/100x100/filters:quality(80)/presentations/platform-engineering-product-mindset/en/smallimage/thumbnail-1784106920162.jpeg" class="card__image"/>
+                </a>
+            
+        </div>
+    </li>
+</ul>
+
+    
+
+
+<a href="/devops/" class="button__more button button__large button__arrow arrow__right">All in  devops</a>
+
+                </div>
+            </div>
+        </div>
+        <div class="li-nav">
+            
+            <a rel="noreferrer noopener" href="https://events.infoq.com/" class="nav__category" title="Events" target="_blank">Events</a>
+        </div>
+    </nav>
+</div>
+
+<div>
+    <h3 class="widget__heading">Helpful links</h3>
+    <ul class="no-style header__nav">
+       <li>
+            <a href="/about-infoq" title="About InfoQ">
+                About InfoQ
+            </a>
+        </li>
+        <li>
+            <a href="/infoq-editors" title="InfoQ Editors">
+                InfoQ Editors
+            </a>
+        </li>
+        <li>
+            <a href="/write-for-infoq" title="Write for InfoQ">
+                Write for InfoQ
+            </a>
+        </li>
+        <li>
+            <a href="https://c4media.com/" target="_blank" title="About C4Media">
+                About C4Media
+            </a>
+        </li>
+        <li>
+            <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a>
+        </li>
+    </ul>
+</div>
+
+                    
+                    <div>
+                        <h3 class="widget__heading">Choose your language</h3>
+                        
+
+
+
+
+
+
+
+<ul class="language__switcher no-style">
+	<li class="active"><a href="#" onclick="return false;" title="InfoQ English">En</a></li>
+	<li><a href="https://www.infoq.cn">中文</a></li>
+	<li><a href="/jp/">日本</a></li>
+	<li><a href="/fr/">Fr</a></li>
+</ul>
+                    </div>
+                </div>
+                    
+            </div>
+            <div data-nosnippet class="actions header__bottom header__bottom__events">
+                <div class="actions__left">
+                    <div class="events-list" role="list" aria-label="Upcoming events">
+                        <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-08-26">
+                            <a class="event-card" href="https://certification.qconferences.com/ai-security-privacy?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_onlinecohortaisecurity26" target="_blank" rel="noopener noreferrer" aria-label="Online InfoQ AI Security &amp; Privacy Engineering Certification, August 26, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Aug</span><span>26,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">AI Security &amp; Privacy Engineering Certification</p>
+                                    <p class="event-description">Secure and govern production AI systems, from sensitive data to guardrails, evals, and audits.<br><strong>Online. Register now.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-09-14">
+                            <a class="event-card" href="https://certification.qconferences.com/architecture?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_onlinecohortarchitecture26" target="_blank" rel="noopener noreferrer" aria-label="Online InfoQ Architect Certification, Sep 14, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Sep</span><span>14,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">Architect Certification</p>
+                                    <p class="event-description">Distributed systems, decentralized decisions, platform engineering, and AI architecture. <br/><strong>Online. Register Now.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="certification" data-sort-date="2026-08-21">
+                            <a class="event-card" href="https://certification.qconferences.com/engineering-leadership?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_onlinecohortleadership26" target="_blank" rel="noopener noreferrer" aria-label="Engineering Leadership Certification, August 21, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Aug</span><span>21,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">Engineering Leadership Certification</p>
+                                    <p class="event-description">Work through leadership decisions with senior peers facing similar technical trade-offs. <br/><strong>Online. Register Now.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2026-11-16">
+                            <a class="event-card" href="https://qconsf.com/?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_qsf26" target="_blank" rel="noopener noreferrer" aria-label="QCon San Francisco, Nov 16-20, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Nov</span><span>16-20,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">QCon San Francisco</p>
+                                    <p class="event-description">What's working across AI, architecture, and leadership, from the teams doing it. <br/><strong>Register. Early bird ends August 11.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2026-12-15">
+                            <a class="event-card" href="https://newyork.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=homepageheader_qainy26" target="_blank" rel="noopener noreferrer" aria-label="QCon AI New York, December 15-16, 2026">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Dec</span><span>15-16,</span><span>2026</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">QCon AI New York</p>
+                                    <p class="event-description">Production AI across agents, context, evals, security, and infrastructure, from the senior engineers building it.<br/><strong>Registration open.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                        <div class="event-item" role="listitem" data-event-type="qcon" data-sort-date="2027-04-13">
+                            <a class="event-card" href="https://qconlondon.com/?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=homepageheader_qconlondon27" target="_blank" rel="noopener noreferrer" aria-label="QCon London, April 13-16, 2027">
+                                <div class="event-date">
+                                    <div class="event-date-box" aria-hidden="true"><span>Apr</span><span>13-16,</span><span>2027</span></div>
+                                </div>
+                                <div class="event-content">
+                                    <p class="event-title">QCon London</p>
+                                    <p class="event-description">What early-adopter teams have proven in production, across 15 engineering tracks. <br/><strong> Register. Early bird ends August 11.</strong></p>
+                                </div>
+                            </a>
+                        </div>
+                    </div>
+                </div>
+                <!---->
+            </div>
+        </div>
+    </div>
+</header>
+
+            
+
+                <!--	#######		CONTENT START	#########	 -->
+                <main>
+                    
+    <div>
+        <section class="container section white">
+            <div class="container__inner">
+                <article data-type="presentation" class="article grid  ">
+                    
+
+
+
+
+
+
+<p class="crumbs">
+	<span data-nosnippet><a href="/" title="InfoQ Homepage">InfoQ Homepage</a></span>
+	
+		
+			
+			
+                <span data-nosnippet><a href="/presentations" title="Presentations">Presentations</a></span>
+            
+		
+		<span data-nosnippet class="active">Programming with Values in Clojure</span>
+	
+	
+    
+        
+    
+</p>
+
+                    
+
+
+
+
+
+
+
+                    
+
+
+
+
+
+
+
+
+
+
+                    <h1>Programming with Values in Clojure</h1>
+
+                    <div class="article__actions">
+                        
+
+
+
+
+
+
+    <div class="actions__left actions__sidebar article__actions">
+        
+        <button id="toggleLikeContent" class="icon button button__icon like button__gray icon__like" aria-label="Like">Like</button>
+        
+
+
+
+
+
+
+   
+   <div class="bookmarkReading">
+        <button id="bookmarkBtn" data-ref="bookmarkPage" aria-label="Read later" class="login button__gray button button__icon icon icon__bookmark icon--only"> </button>
+      <!-- new dropdown rading list -->
+      <div class="my-0 button__dropdown dropdown reading_list dropdown__center" id="showBookmarks">
+         <button aria-label="Reading list" class="button button__unstyled button__small"></button>
+         <div class="dropdown__holder">
+            <div class="dropdown__content">
+               <ul class="no-style dropdown__nav">
+                  <li class="active"><a href="/showbookmarks.action">Reading list</a></li>
+               </ul>
+            </div>
+         </div>
+      </div>
+      
+      <div id="toastContainer" class="toast-none toast-hide">
+          <div class="toast"><span></span></div>
+      </div>
+   </div>
+   
+
+<script type="text/javascript">
+        
+        if(loggedIn){
+                $('#showBookmarks').css('display', 'flex');
+        }
+        
+        function performBookmark() {
+                Bookmarks.toggleBookmark('presentations', 'Programming-with-Values-in-Clojure');
+        }
+        
+        infoq.event.on('bookmarkRequested', function(e) {
+                Bookmarks.toggleBookmark('presentations', 'Programming-with-Values-in-Clojure');
+        });
+        
+        infoq.event.on("loaded", function(){
+                if(loggedIn){
+                        var href = window.location.href;
+                        if(href.indexOf("#bookmarkPage") != -1){
+                                $('#bookmarkBtn').click();
+                        }
+                }
+        });
+        
+        $(document).ready(function() {
+                if(Bookmarks.isContentBookmarked == 'true'){
+                        $('#bookmarkBtn').addClass('button__green');
+                        $('#bookmarkBtn').removeClass('button__gray');
+                }else{
+                        $('#bookmarkBtn').removeClass('button__green');
+                        $('#bookmarkBtn').addClass('button__gray');
+                }
+        });
+</script>
+
+    </div>
+                    </div>
+
+                    
+
+                    <div class="presentation__switch">
+                        <label class="label">View Presentation</label>
+                        <ul class="no-style">
+                            <li><button class="button button__unstyled button__tooltip tooltip__top button__icon icon icon__pres-2-cols icon--only active" aria-label="Vertical" data-tip="Vertical" data-tip-placement="top" data-key="pres-2-cols">Vertical</button></li>
+                            <li><button class="button button__unstyled button__tooltip tooltip__top button__icon icon icon__pres-1-col icon--only" aria-label="Horizontal" data-tip="Horizontal" data-tip-placement="top" data-key="pres-1-col">Horizontal</button></li>
+                            <li><button class="button button__unstyled button__tooltip tooltip__top button__icon icon icon__pres-fs icon--only" aria-label="Full" data-tip="Full" data-tip-placement="top" data-key="pres-fs">Full</button></li>
+                        </ul>
+                    </div>
+                    <div class="speed">
+                        <label class="label">Speed:</label>
+                        <ul id="presentation_speed" class="no-style presentation_speed">
+                            <li><button class="button button__unstyled active" aria-label="1x" onclick="P.adjustSpeed(1.0, $(this));return false;">1x</button></li>
+                            <li><button class="button button__unstyled" aria-label="1.25x" onclick="P.adjustSpeed(1.25, $(this));return false;">1.25x</button></li>
+                            <li><button class="button button__unstyled" aria-label="1.5x" onclick="P.adjustSpeed(1.5, $(this));return false;">1.5x</button></li>
+                            <li><button class="button button__unstyled" aria-label="2x" onclick="P.adjustSpeed(2.0, $(this));return false;">2x</button></li>
+                        </ul>
+                    </div>
+
+                    <div class="player">
+                        <div id="player">
+                            
+                                <script type="text/javascript">
+                                    SlideSynchronizer.setTimes(TIMES);
+                                    SlideSynchronizer.playerId="video";
+                                </script>
+                                <video id="video" playsinline controls controlsList="nodownload" width="100%" height="100%" onplay="SlideSynchronizer.start();"></video>
+                            
+                        </div>
+                        <div class="actions player__actions">
+                            <div class="actions__left">
+                                
+                                    <label class="label">Download</label>
+                                    <ul class="no-style download">
+                                        
+                                            
+                                            
+                                            <li data-ref="downloadPresentationMp3">
+                                                <button id="mp3" class="button button__unstyled download" data-type="mp3" aria-label="MP3">MP3</button>
+                                            </li>
+                                            <form method="get" action="/mp3download.action" target="_blank" id="mp3Form">
+                                                <input type="hidden" name="filename" value="presentations/infoq-12-mar-valuesinclojure.mp3"/>
+                                            </form>
+                                        
+                                        
+                                            
+                                            
+                                                
+                                                
+                                                <li data-ref="downloadPdf">
+                                                    <button id="slides" class="button button__unstyled download" data-type="slides" aria-label="Slides">Slides</button>
+                                                </li>
+                                                <form method="get" action="/pdfdownload.action" target="_blank" id="pdfForm">
+                                                    <input type="hidden" name="filename" value="presentations/ClojureWEST-AlanDipert-ProgrammingwithValuesinClojure.pdf"/>
+                                                </form>
+                                            
+                                        
+                                    </ul>
+                                
+                            </div>
+                            <div class="actions__right"><span>46:25</span></div>
+                        </div>
+                    </div>
+
+                    <div id="slideContainer" class="intro slides">
+                        <div id="slide"></div>
+                    </div>
+
+                    <div class="summary">
+                        <h2 class="heading">Summary</h2>
+                        <p>Alan Dipert discusses the benefits of functional programming in Clojure, suggesting using pure functions to process values and sometimes explicit procedures for needed side effects.</p>
+                    </div>
+
+                    <div data-nosnippet class="bio">
+                        <h2 class="heading">Bio</h2>
+                        <p>Alan Dipert has contributed to Clojure, ClojureScript, and several Clojure projects including Leiningen and Incanter. As a consultant with Clojure/core, he has also worked on a variety of commercial Clojure projects. He lives in Durham, North Carolina, where he helps run Splat Space, the local hackerspace. His favorite computer is the Arduino microcontroller, for which he implemented a Lisp.</p>
+                    </div>
+                    <div data-nosnippet class="about-conference">
+                        <h2 class="heading">About the conference</h2>
+                        <p>Clojure/West is a new conference bringing the Clojure community together to discuss techniques, tools, and the state of the Clojure ecosystem March 16-17th for three tracks of sessions.  Prior to the conference, register for three days of training by the Clojure experts.</p>
+                    </div>
+                    
+
+                    <div class="article__content">
+                        <div class="article__data">
+                            
+                        </div>
+                        
+                        
+                        
+                        
+                            
+                                
+                                
+                                
+                                
+                                    
+                                    
+                                
+                                
+                                    
+                                
+                            
+                        
+                        
+                    </div>
+
+                    <div class="aside">
+                        <div class="recorded">
+                            <p class="meta recorded__meta">Recorded at:</p>
+                            <a href="http://clojurewest.org/">
+                                <img loading="lazy" alt="" src="https://res.infoq.com/presentations/Programming-with-Values-in-Clojure/en/promoimage/WEST.jpg">
+                            </a>
+                        </div>
+                        <p class="date">Jun 11, 2012</p>
+                        <div class="article__authors authors">
+                            <div>
+                                <p class="meta">by</p>
+                                
+
+
+
+
+
+
+
+
+
+
+
+
+
+<ul class="no-style authors">
+    
+        
+            
+        
+        <li data-id="author-Alan-Dipert">
+            <p class="meta author__bio">
+                
+                <a href="/profile/Alan-Dipert/" class="avatar author__avatar" aria-label="Alan Dipert"></a>
+                <span class="author__name">
+                    <a href="/profile/Alan-Dipert/" class="author__link">Alan Dipert</a>
+                </span>
+            </p>
+            
+        </li>
+    
+</ul>
+                            </div>
+                        </div>
+                        
+                    </div>
+
+                    
+                    
+
+
+
+
+
+
+<div class="widget article__fromTopic topics">
+    
+        <div class="widget__head related__for-topic" data-id="1" data-trk-ref="content_primary_topic">
+            <h4 class="heading related__heading">
+                
+                
+                    
+                This content is in the <a href='/java/'>Java</a> topic
+            </h4>
+        </div>
+    
+    <h5 class="heading related__inline">Related Topics:</h5>
+    <ul class="no-style topics related__topics topics__small" data-trk-ref="content_related_topic">
+         
+            
+                
+                    
+                
+                
+                <li data-id="6815">
+                    <a href="/development/" class="button related__topic button__small button__black">Development</a>
+                </li>
+            
+        
+        
+            
+                
+                    
+                
+                
+                <li data-id="4929">
+                    <a href="/Clojure/" class="button related__topic button__small button__black">Clojure</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="7299">
+                    <a href="/Clojure-West-2012/" class="button related__topic button__small button__black">Clojure/West 2012</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="7236">
+                    <a href="/JVM_Langugaes/" class="button related__topic button__small button__black">JVM Languages</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="1">
+                    <a href="/java/" class="button related__topic button__small button__black">Java</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="7298">
+                    <a href="/Clojure-West/" class="button related__topic button__small button__black">Clojure/West</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="362">
+                    <a href="/fp/" class="button related__topic button__small button__black">Functional Programming</a>
+                </li>
+            
+                
+                    
+                
+                
+                <li data-id="1010">
+                    <a href="/lisp/" class="button related__topic button__small button__black">LISP</a>
+                </li>
+            
+        
+    </ul>
+</div>
+
+
+                    
+                        
+                        
+                        
+
+
+
+
+
+<script type="text/javascript">
+    createOptionalVcrs({
+         uriMapping : "presentations",
+         languageUri : "",
+         excludedVcrIds : "",
+         nativeVcrAdsEnabled : "true",
+         vcrsPosition : "2"
+    });
+
+    function createOptionalVcrs(params) {
+        if(params.nativeVcrAdsEnabled) {
+            VCR.addIdstoExcludeList(params.excludedVcrIds);
+            if(params <= 1) {
+                window.finishedVcrOptional1 = false;
+            }else if(params.vcrsPosition == 2) {
+                window.finishedVcrOptional2 = false;
+            }
+            var intervalOptional = setInterval(function() {
+                if(window.vcrsLoaded) {
+                    if((InfoQConstants.pageType == "HOMEPAGE" && (params.vcrsPosition <=1 || window.finishedRelatedVcr)) ||
+                            (InfoQConstants.pageType != "HOMEPAGE" &&
+                            (window.contentVcrFinished == true && (params.vcrsPosition == 2 || params.vcrsPosition <= 1)))) {
+                        clearInterval(intervalOptional);
+                        if(InfoQConstants.countryCode == "" || InfoQConstants.countryCode == "/br" || InfoQConstants.countryCode == "/fr") {
+                            var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, 2, true, null);
+                            if(vcrs != null && vcrs.length == 2)
+                            {
+                                getOptionalElements(vcrs, params);
+                            }
+                            toggleAds(vcrs, params);
+                        } else {
+                            if(params.vcrsPosition <= 1) {
+                                window.finishedVcrOptional1 = true;
+                            } else {
+                                window.finishedVcrOptional2 = true;
+                            }
+                        }
+                    }
+                }
+
+            }, 200);
+        }
+    }
+</script>
+
+    
+        
+        <div id="vcrOptional2"
+             class="widget prsp box__border f_Ceq6VfqVEhhRZDLhUeuo box nocontent  "
+             data-place="2"  data-trk-view="true" data-trk-impr="true">
+            
+                <h3 class="widget__heading">Sponsored Content</h3>
+            
+            
+
+            <ul class="prsp__items no-style vcrs_optional_2"></ul>
+        </div>
+    
+
+                    
+
+                    
+                    
+                    
+                    
+                        
+
+
+
+
+
+
+
+<script type="text/javascript">
+    var uriMapping = "presentations";
+    var showVcr = "true";
+    var fillWithVcr = "false";
+    var sponsorshipsJson = "{&quot;links&quot;:null}";
+    var sponsoredLinks = $.parseJSON($("<div/>").html(sponsorshipsJson).text()).links;
+    var numberOfSponsoredVcrIds = sponsoredLinks != null ? sponsoredLinks.length : 0;
+
+    var maxItems = 5 - numberOfSponsoredVcrIds;
+    var displayWidget = false;
+    var intervalVcrSponsorEditorial = setInterval(function() {
+        if (window.vcrsLoaded) {
+            clearInterval(intervalVcrSponsorEditorial);
+            if(showVcr || fillWithVcr) {
+                if(fillWithVcr) {
+                    for(var index in window.vcrList) {
+                        if(VCR.isVcrSponsored(sponsoredLinks, window.vcrList[index])) {
+                            VCR.addToExcludedList(window.vcrList[index]);
+                        }
+                    }
+                }
+                var vcrs = VCR.getByTopicsAndCommunities(window.vcrList, topicIds, communityIds, maxItems, false, null);
+                if (vcrs != null && vcrs.length > 0 || (sponsoredLinks != null && sponsoredLinks.length > 0)) {
+                    VCR.addToExcludedList(vcrs);
+                    getCommonElements(vcrs, uriMapping, "BOTTOM");
+                    $('.related__group').find(".rvc__list").css("display", "block");
+                    displayWidget = true;
+                } else {
+                    $('.related__group').find(".rvc__list").parent("li").remove();
+                }
+            }
+            window.contentVcrFinished = true;
+            // search for infoq.event.on("contentVcrFinished",... to see how/where it is used
+            infoq.event.trigger("contentVcrFinished");
+        }
+    }, 200);
+</script>
+<input type="hidden" name="" value="" id="cont_item_primary_topic"/>
+
+
+
+
+<script type="text/javascript">
+    $(document).ready(function() {
+        $.ajax({
+            url: "/api/recommendationlinks.action",
+            contentType: "application/x-www-form-urlencoded; charset=utf-8",
+            type: 'POST',
+            data: {
+                "primaryTopicAlias": "",
+                "topicIds": "1452,2830,358",
+                "title": "Programming with Values in Clojure",
+                "contentPath": "/presentations/Programming-with-Values-in-Clojure",
+                "language": "en"
+            },
+            success: displayRelatedEditorial,
+            async: false
+        });
+    });
+
+    function displayRelatedEditorial(data) {
+        $('.related__editorial h4').text("Related Editorial");
+        if (data && data.length > 0) {
+            if(data[0].fromEs) {
+                //change title and tracking params
+                var box_title="";
+                //replace html entity since it conflicts with style
+                box_title=box_title.replace("&amp;","&");
+                $('.related__editorial h4').text("Popular in " + box_title);
+            }
+            for (var i = 0; i < data.length; i++) {
+                if (i === 5) {
+                    break;
+                }
+                if (data[i].url.indexOf("/presentations/Programming-with-Values-in-Clojure") !== -1) {
+                    console.log("Removing the current item from list...");
+                    continue;
+                }
+                var theLinkURL = data[i].url;
+                if(!theLinkURL.endsWith("/")) {
+                    theLinkURL = theLinkURL + "/";
+                }
+                var link = $('<li><h5 class="rvc__title"><a title="" href="' + theLinkURL + '">' + data[i].title + '</a></h5></li>');
+                $('.related__editorial ul').append(link);
+            }
+            $('.related__editorial').show();
+            displayWidget = true;
+        }else{
+            $('.related__editorial').parent("li").remove();
+        }
+        
+        if(displayWidget==true){
+            $('.related__group').attr("data-cols", $('.related__group').find(">li").length);
+            $('.related__group').css("display", "flex");
+        }
+    }
+</script>
+
+<ul class="no-style related__group nocontent cards">
+    <li>
+        <div class="related__editorial">
+            <h4 class="heading">Related Editorial</h4>
+            <ul></ul>
+        </div>
+    </li>
+    <li>
+        <ul class="no-style rvc__list f_rvcbox" data-place="BOTTOM" data-trk-view="true" data-trk-impr="true"
+            
+            
+                style="display: none"
+            
+        >
+            <h4 class="heading">Related Sponsors</h4>
+            
+            <div class="f_rvcList"></div>
+            
+                
+            
+        </ul>
+    </li>
+    
+    
+    
+        
+        <li class="bg-gray is-movable">
+            <div class="related__prsp">
+                <h4 class="heading">Popular across InfoQ</h4>
+                <ul>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/typescript-7-released/" class="rvc__link">
+                                Microsoft Releases TypeScript 7.0 with a Native Go Compiler, Delivering 10x Faster Builds
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/podcasts/feature-evolution-performance-transition-endive/" class="rvc__link">
+                                WebAssembly on the JVM: Feature Evolution, Performance, and the Transition to Endive
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/java-news-roundup-jul27-2026/" class="rvc__link">
+                                Java News Roundup: OpenJDK JEPs, Jakarta EE, GraalVM, TornadoVM, Micronaut, Quarkus, JobRunr, Maven
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/vault-kubernetes-key-management/" class="rvc__link">
+                                HashiCorp Ships Public Beta of Vault Kubernetes Key Management
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/presentations/microservices-platform-team-topology/" class="rvc__link">
+                                Microservices Platforms: When Team Topologies Meets Microservices Patterns
+                            </a>
+                        </h5>
+                    </li>
+                    
+                    <li>
+                        <h5 class="rvc__title">
+                            
+                            <a href="/news/2026/08/vercel-ships-zero-ai/" class="rvc__link">
+                                Vercel Labs Ships Zero: a Graph-First Language Built So Agents Write the Code
+                            </a>
+                        </h5>
+                    </li>
+                    
+                </ul>
+            </div>
+        </li>
+        
+    
+</ul>
+
+                    
+                    
+                  </article>
+            </div>
+        </section>
+    </div>
+        <div id="imgPreload"></div>
+
+        <script type="text/javascript">
+            // global vars that can be used for this page, use this section to add more.
+            var contentTitle = "Programming with Values in Clojure",
+                contentPath = "/presentations/Programming-with-Values-in-Clojure",
+                contentUUID = "87d6ecfd-09d2-4a89-8290-140c131dc16f",
+                authorUserCSVIds = "101760482";
+        </script>
+
+        <script type="text/javascript">
+            // needed for starting download after IDP login, processing starts after frontend modules are loaded
+            infoq.event.on("loaded", function(){
+                if(loggedIn){
+                    var href = window.location.href;
+                    if(href.indexOf("#downloadPdf") != -1){
+                        //window.location.href = href.substring(0, href.indexOf('#'));
+                        $('#slides').click();
+                    } else if(href.indexOf("#downloadPresentationMp3") != -1){
+                        //window.location.href = href.substring(0, href.indexOf('#'));
+                        $('#mp3').click();
+                    }
+                }
+            });
+            P.c(false, 'p', isWideScreen, 'https://cdn.infoq.com/statics_s1_20260729094803/styles/static/images/logo/logo_scrubber_16_9.jpg', 'https://cdn.infoq.com/statics_s1_20260729094803/styles/static/images/logo/logo_scrubber_4_3.jpg');
+            
+
+
+
+
+
+
+//wait for the player to be ready
+document.getElementById("video").addEventListener('loadeddata', function() { 
+    //check if we are requested to jump to a specific time in the video
+    var t = CommonUtils.getQueryParameterByName("t");
+    if(t !== null && t.length <= 9) {
+        SlideSynchronizer.start();
+        P.seekPlayerTime(t, true);
+    }
+}, false);
+
+        </script>
+
+    
+                </main>
+
+            
+                
+
+
+
+
+
+
+
+<footer class="footer ">
+	
+		
+		<section data-nosnippet class="section container">
+			<div class="container__inner">
+				
+					
+					
+					
+					
+					
+					
+				
+
+
+<ul data-cols="5" class="no-style columns boxes topic__boxes">
+    
+        <li class="development">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/development/">Development</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/github-npm-actions-defaults/" title="GitHub Hardens npm and Actions Defaults, Drawing Debate over Delays versus Signing">GitHub Hardens npm and Actions Defaults, Drawing Debate over Delays versus Signing</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/ponytail-agent-skill-benchmark/" title="Ponytail Agent Skill Corrects its Own Benchmark after Contributor Challenge">Ponytail Agent Skill Corrects its Own Benchmark after Contributor Challenge</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/cloudflare-meerkat-consensus/" title="Cloudflare Introduces Meerkat for Strongly Consistent Global Coordination">Cloudflare Introduces Meerkat for Strongly Consistent Global Coordination</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="architecture-design">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/architecture-design/">Architecture &amp; Design</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/instacart-blueberry-sre-ai/" title="Instacart Builds Blueberry, an AI-Powered Assistant to Help On-Call Engineers Investigate Incidents">Instacart Builds Blueberry, an AI-Powered Assistant to Help On-Call Engineers Investigate Incidents</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/presentations/valkey-architecture-patterns/" title="From ms to &amp;micro;s: OSS Valkey Architecture Patterns for Modern AI">From ms to &micro;s: OSS Valkey Architecture Patterns for Modern AI</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/jiohotstar-ad-decisioning-flow/" title="JioHotstar Explains the Distributed Engineering behind Personalized Ad Requests at Streaming Scale">JioHotstar Explains the Distributed Engineering behind Personalized Ad Requests at Streaming Scale</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="culture-methods">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/culture-methods/">Culture &amp; Methods</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/articles/culture-trends-2026/" title="InfoQ Culture and Methods Trends Report - 2026">InfoQ Culture and Methods Trends Report - 2026</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/podcasts/infoq-culture-trends-2026/" title="Culture &amp;amp; Methods Trends 2026: The Human Side of AI Engineering">Culture &amp; Methods Trends 2026: The Human Side of AI Engineering</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/platform-products-people-use/" title="From Projects to Products: Turning Platforms into Products People Use">From Projects to Products: Turning Platforms into Products People Use</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="ai-ml-data-eng">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/ai-ml-data-eng/">AI, ML &amp; Data Engineering</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/database-remediation-graph/" title="Stripe Uses Graph Search and State Machines to Automate Database Remediation">Stripe Uses Graph Search and State Machines to Automate Database Remediation</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/presentations/openai-performance-engineering-agentic-coding/" title="Keeping ChatGPT Fast as AI Development Accelerates">Keeping ChatGPT Fast as AI Development Accelerates</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/cloudflare-computer-agents/" title="Cloudflare Launches Persistent, Stateful, Computer-like Environments for Agents">Cloudflare Launches Persistent, Stateful, Computer-like Environments for Agents</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+        <li class="devops">
+            <div class="box__header">
+                
+                <a class="t_all_footer_more-boxes-header" href="/devops/">DevOps</a>
+            </div>
+            <div class="box__content">
+                <ul class="no-style box__list small">
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/ai-incident-response/" title="AI Is Transforming Incident Response - but the Hardest Problems May Still Belong to Humans">AI Is Transforming Incident Response - but the Hardest Problems May Still Belong to Humans</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/rootly-small-pr-agentic-ai/" title="Rootly Drops Small PR Rule as Agentic AI Changes Code Review Economics">Rootly Drops Small PR Rule as Agentic AI Changes Code Review Economics</a></h5>
+                        </li>
+                    
+                        <li>
+                            
+                            <h5><a class="t_all_footer_more-boxes-item" href="/news/2026/08/pod-deployment-unit-ai-agents/" title="Pods as Workers, Not Agents: Rethinking the Deployment Unit for AI Agents on Kubernetes">Pods as Workers, Not Agents: Rethinking the Deployment Unit for AI Agents on Kubernetes</a></h5>
+                        </li>
+                    
+                </ul>
+            </div>
+        </li>
+    
+</ul>
+
+
+
+			</div>
+		</section>
+		<section data-nosnippet class="container section section__newsletter">
+			<div class="columns container__inner">
+				 
+
+
+
+
+
+
+
+
+
+    
+
+
+
+
+
+
+
+<div class="newsletter" data-col="1/2"
+
+	
+		
+			id="infoq-nl"
+		
+
+	
+	
+>
+	<h2 class="heading">
+		<strong>The InfoQ</strong> Newsletter
+	</h2>
+	<p class="intro">A round-up of last week&#x2019;s content on InfoQ sent out every Tuesday. Join a community of over 250,000 senior developers.
+		
+			<a target="_blank" href="https://assets.infoq.com/newsletter/regular/en/newsletter_sample/newsletter_sample.html">View an example</a>
+		
+		
+	</p>
+	<ul class="newsletter__features">
+		<li>Get a quick overview of content published on a variety of innovator and early adopter technologies</li>
+		<li>Learn what you don&#x2019;t know that you don&#x2019;t know</li>
+		<li>Stay up to date with the latest information from the topics you are interested in</li>
+	</ul>
+	<div class="newsletter__subscribe">
+		<form class="form gdpr" name="footerNewsletterForm" id="footerNewsletterForm" action="#" onsubmit="footerNewsletter.saveSubscription(); return false;">
+			<div class="field newsletter__mail input__text input__no-label input__medium email">
+				<label for="email-newsletter-infoq" class="label field__label">Enter your e-mail address</label>
+				<input id="email-newsletter-infoq" name="footerNewsletterEmail" placeholder="Enter your e-mail address" class="input field__input" type="email"/>
+				<input type="text" name="emailH" id="input_email_h" aria-required="false" style="display:none !important" tabindex="-1" autocomplete="off"/>
+				<input type="hidden" id="fnt" name="fnt" value="1N0V7Nci96vmB2vJ"/>
+				<input type="hidden" id="footerNewsletterType" name="footerNewsletterType" value="regular"/>
+				<input type="hidden" id="cmpi" name="cmpi" value="1"/>
+			</div>
+			<div class="hidden">
+				<span class="input__select field country">
+					<label for="input-simple-newsletter-country" class="label field__label">Select your country</label>
+					<select id="input-simple-newsletter-country" class="select field__input">
+						<option value="" class="select__option">Select a country</option>
+					</select>
+					<p class="input__message field__desc"></p>
+				</span>
+				<span class="input__checkbox field hidden">
+					<input type="checkbox" id="gdpr-consent-simple-nl">
+					<label for="gdpr-consent-simple-nl" class="label"><span>I consent to InfoQ.com handling my data as explained in this <a href="https://www.infoq.com/privacy-notice">Privacy Notice</a>.</span></label>
+				</span>
+			</div>
+			<input type="submit" role="button" value="Subscribe" class="button button__medium button__red" onclick="return footerNewsletter.validateEmail('Invalid email address');"/>
+		</form>
+		<p class="meta">
+			<a href="/privacy-notice/" target="_blank">We protect your privacy.</a>
+		</p>
+		
+		<span class="success" style="display:none;" id="footerNewsletterMessage"></span>
+	</div>
+	<script type="text/javascript">
+		var footerNewsletter = new Newsletter('Enter your e-mail address',
+				'email-newsletter-infoq', 'footerNewsletterType','footerNewsletterMessage', 'fnt', 'input_email_h', 'input-simple-newsletter-country', 'cmpi','footer_except_homepage');
+	</script>
+</div>
+
+
+    
+        
+        
+    
+
+
+
+
+
+
+
+
+
+
+
+
+
+    
+    
+    
+    
+    
+    <div data-col="1/2" data-bg="certification" class="event__container" style="padding-right: 20px;">
+        <a href="https://certification.qconferences.com/?utm_source=infoq&amp;utm_medium=referral&amp;utm_campaign=largefooterad_onlinecohorts26" target="_blank" class="qconplus__events-slider" style="">
+            <div>
+                <div class="logo-certification"></div>
+            </div>
+            <p class="intro" style="margin-bottom: 0;color: white !important;">
+                <b>InfoQ Online Certification Programs</b>
+                <br>For Senior Engineers, Architects, and Technical Leaders
+            </p>
+            <ul style="margin-bottom: 0;">
+                <li style="color: white !important;"><b>AI Engineering</b> with Hien Luu | July 25</li>
+                <li style="color: white !important;"><b>Architect</b> with Luca Mezzalira | August 13</li>
+                <li style="color: white !important;"><b>Engineering Leadership</b> with Michelle Brush | August 21</li>
+                <li style="color: white !important;"><b>AI Security &amp; Privacy Engineering</b> with Katharine Jarmul | August 26</li>
+            </ul>
+            <br>
+            <p class="intro" style="margin-bottom: 0;color: white !important;">As your role becomes more senior, the work changes. You're no longer just implementing decisions; you're shaping the systems, trade-offs, and technical direction other teams depend on.<br>These 5-week online programs give you a structured way to work through real decisions from your current role with senior peers from other companies.</p>
+            <strong class="button button__green cta__button">RESERVE YOUR PLACE</strong>
+            <small style="color: white;"><br>Live online. 4 hours a week, for 5 weeks.</small>
+        </a>
+    </div>
+
+
+
+
+
+
+			</div>
+		</section>
+	
+	<section data-nosnippet class="section container footer__subfooter align__left">
+		<div class="container__inner columns">
+			 <div data-col="1/4" class="columns footer__links-wrap">
+				  <div class="footer__links">
+						
+
+
+
+
+
+
+
+
+<a href="/" class="nuxt-link-exact-active active" title="Home">Home</a>
+
+
+    <a href="/reginit.action" class="emphasis" title="Create account">Create account</a>
+    <button aria-label="Log In" class="login" data-ref="mainLogin">Log In</button>
+
+
+<a rel="noreferrer noopener" href="http://qconferences.com/" target="_blank" title="QCon Conferences">QCon Conferences</a>
+<a rel="noreferrer noopener" href="https://events.infoq.com/" target="_blank">Events</a>
+
+    <a href="/write-for-infoq/" title="Write for InfoQ">Write for InfoQ</a>
+    <a href="/infoq-editors/" title="InfoQ Editors">InfoQ Editors</a>
+    <a href="/about-infoq/" title="About InfoQ">About InfoQ</a>
+    <a href="https://c4media.com/" target="_blank" title="About C4Media">About C4Media</a>
+    
+        <a rel="noreferrer noopener" href="https://get.infoq.com/infoq-mediakit/" title="Media Kit" target="_blank">
+            Media Kit
+        </a>
+        <a href="https://devmarketing.c4media.com/?utm_source=infoq" title="InfoQ Developer Marketing Blog" target="_blank">InfoQ Developer Marketing Blog</a>
+    
+    <a rel="noreferrer noopener" href="https://c4media.com/diversity" title="Diversity" target="_blank">Diversity</a>
+
+				  </div>
+
+			</div>
+			<div data-col="1/4" class="events__list">
+				<h4 class="heading footer__heading">Events</h4>
+                                <ul class="qcons__list no-style">
+                                    
+
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://certification.qconferences.com/engineering-leadership?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortleadership26" target="_blank">Online InfoQ Engineering Leadership Certification</a>
+                                            </h5>
+                                            <span class="meta date">August 21, 2026</span>
+                                        </div>
+                                    </li>
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://certification.qconferences.com/ai-security-privacy?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortaisecurity26" target="_blank">Online InfoQ AI Security & Privacy Engineering Program</a>
+                                            </h5>
+                                            <span class="meta date">August 26, 2026</span>
+                                        </div>
+                                    </li>
+                                        <li><span class="icon event__type conference"></span>
+                                                <div class="qcon__detail">
+                                                        <h5 class="heading">
+                                                                <a rel="noreferrer noopener" href="https://certification.qconferences.com/architecture?utm_source=infoq&utm_medium=referral&utm_campaign=footer_onlinecohortarchitecture26" target="_blank">Online InfoQ Architect Certification</a>
+                                                        </h5>
+                                                        <span class="meta date">September 14, 2026</span>
+                                                </div>
+                                        </li>
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://qconsf.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qsf26" target="_blank">QCon San Francisco</a>
+                                            </h5>
+                                            <span class="meta date">November 16-20, 2026</span>
+                                        </div>
+                                    </li>
+									<li><span class="icon event__type conference"></span>
+										<div class="qcon__detail">
+											<h5 class="heading">
+												<a rel="noreferrer noopener" href="https://newyork.qcon.ai/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qainy26" target="_blank">QCon AI New York</a>
+											</h5>
+											<span class="meta date">December 15-16, 2026</span>
+										</div>
+									</li>
+                                    <li><span class="icon event__type conference"></span>
+                                        <div class="qcon__detail">
+                                            <h5 class="heading">
+                                                <a rel="noreferrer noopener" href="https://qconlondon.com/?utm_source=infoq&utm_medium=referral&utm_campaign=footer_qlondon27" target="_blank">QCon London 2027</a>
+                                            </h5>
+                                            <span class="meta date">April 13-16, 2027</span>
+                                        </div>
+                                    </li>
+                                </ul>
+			</div>
+			<div data-col="1/4" class="footer__social-wrap">
+				<h4 class="heading text-left footer__heading">Follow us on </h4>
+				<div class="social__links columns social__links__row">
+                            
+                                
+                                        <a href="https://www.youtube.com/infoq"><span class="icon icon__large icon__social icon__youtube"></span><div><span class="social__count">Youtube</span><span class="social__followers">232K Followers</span></div></a>
+                                        <a href="http://www.linkedin.com/company/infoq"><span class="icon icon__large icon__social icon__linkedin"></span><div><span class="social__count">Linkedin</span><span class="social__followers">26K Followers</span></div></a>
+										<a rel="noreferrer noopener" href="https://www.instagram.com/infoqdotcom/" target="_blank"><span class="icon icon__large icon__social icon__instagram"></span><div><span class="social__count">Instagram</span><span class="social__followers">New</span></div></a>
+                                        <a href="#" id="footerNewsletterRssLink"><span class="icon icon__large icon__social icon__rss"></span><div><span class="social__count">RSS</span><span class="social__followers">19K Readers</span></div></a>
+                                        <a rel="noreferrer noopener" href="http://twitter.com/infoq" target="_blank"><span class="icon icon__large icon__social icon__twitter"></span><div><span class="social__count">X</span><span class="social__followers">57.1k Followers</span></div></a>
+                                        <a rel="noreferrer noopener" href="https://www.facebook.com/InfoQ-75911537320" target="_blank"><span class="icon icon__large icon__social icon__fb"></span><div><span class="social__count">Facebook</span><span class="social__followers">21K Likes</span></div></a>
+                                        <a rel="noreferrer noopener" href="https://bsky.app/profile/infoq.com" target="_blank"><span class="icon icon__large icon__social icon__bluesky"></span><div><span class="social__count">Bluesky</span><span class="social__followers">New</span></div></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                
+                                
+                                
+                                
+				</div>
+			</div>
+            <div data-col="1/4" class="footer__stayin-wrap">
+                <h4 class="heading text-left footer__heading">Stay in the know</h4>
+                <div class="stayIn_panel_container">
+                    <a href="/podcasts/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The InfoQ Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7IndlYnAiOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QuanBnIiwiZWRpdHMiOiB7ImpwZWciOiB7ICJxdWFsaXR5Ijo4MH19fQ==" loading="lazy" width="65px" height="64px" alt="The InfoQ Podcast Logo - Stay in the know"></picture></a>
+                    <a href="/podcasts/#engineering_culture" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>Engineering Culture Podcast</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsid2VicCI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLXBvZGNhc3QtZW5naW5lZXJpbmctY3VsdHVyZS5qcGciLCJlZGl0cyI6IHsianBlZyI6IHsgInF1YWxpdHkiOjgwfX19" loading="lazy" width="65px" height="64px" alt="Engineering Culture Podcast Logo - Stay in the knoww"></picture></a>
+                    <a href="/software-architects-newsletter/" class="stayIn_panel" target="_blank" rel="noreferrer noopener"><span>The Software Architects' Newsletter</span><picture><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJ3ZWJwIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><source srcset="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" type="image/webp"><img src="https://imgopt.infoq.com/eyJidWNrZXQiOiAiYXNzZXRzLmluZm9xLmNvbSIsImtleSI6ICJ3ZWIvZm9vdGVyL2luZm9xLWFyY2hpdGVjdC1uZXdzbGV0dGVyLmpwZyIsImVkaXRzIjogeyJqcGVnIjogeyAicXVhbGl0eSI6ODB9fX0=" loading="lazy" width="65px" height="64px" alt="The Software Architects' Newsletter Logo - Stay in the know"></picture></a>
+                </div>
+            </div>
+			
+		</div>
+	</section>
+	<section data-nosnippet class="container footer__bottom section white align__left">
+		<div class="container__inner columns">
+			<div data-col="2/3" class="column">
+				<div class="footer__contact contact columns">
+					
+					
+						<span data-col="1/6">
+							General Feedback
+							<a href="mailto:feedback@infoq.com">feedback@infoq.com</a>
+						</span>
+						<span data-col="1/6">
+							Advertising
+							<a href="mailto:sales@infoq.com">sales@infoq.com</a>
+						</span>
+						<span data-col="1/6">
+							Editorial
+							<a href="mailto:editors@infoq.com">editors@infoq.com</a>
+						</span>
+						<span data-col="1/6">
+							Marketing
+							<a href="mailto:marketing@infoq.com">marketing@infoq.com</a>
+						</span>
+					
+				</div>
+			</div>
+			<div class="column" data-col="1/3">
+				<p class="footer__more">
+					InfoQ.com and all content copyright &#169; 2006-2026 C4Media Inc.<br/>
+					
+						<a href="/privacy-notice" target="_blank">Privacy Notice</a>, <a href="/terms-and-conditions " target="_blank">Terms And Conditions</a>, <a href="/cookie-policy " target="_blank">Cookie Policy</a>
+					
+					
+				</p>
+			</div>
+		</div>
+	</section>
+</footer>
+                <!--	#######		SITE END	#########	 -->
+            
+        </div>
+
+
+        
+            <div class="intbt">
+                <a href="/int/bt/" title="bt">BT</a>
+            </div>
+        
+
+        
+
+
+
+
+
+<script type="text/javascript">
+  $.when(humanDetectionAsync()).then(
+      function(status) {
+          $.getScript("/scripts/__hd.ifq?hdt=1N0V7Nci96vmB2vJ&ha=" + status);
+      }
+  );
+</script>
+<script type="text/javascript">
+
+    var pageFullyLoaded = false;
+    // this event is fired by frontend once all the necessary things have been done(mobile display, moving vcr boxes around when needed...)
+    infoq.event.on('loaded', function(e) {
+        pageFullyLoaded = true;
+    });
+
+    infoq.event.on('pageWidthChanged', function(e) {
+        // re-execute tracking vcr impressions when this event happens (it only happens when elements are added/removed from page)
+        // doTrackVcrImpressions takes into account the data-trk-impr="true" if =false the element was already tracked.
+        // this is needed when switching from mobile to desktop or when layout on mobile changes and desktop version is displayed. New elements become visible.
+        Tracker.safeExec(Tracker.doTrackVcrImpressions);
+
+        // these 2 need to be called also because we might be on a content page. In case we are not nothing happens
+        VCR.doTrackingCustomRightbar();
+        VCR.doTrackingCustomRightbarForPresentations()
+    });
+
+    //check to see if error page
+    if(window.device !== undefined) {
+        var intervalImpressions = setInterval(function() {
+            var shouldTrack = false;
+
+            // no vcr widgets on index pages
+            if(window.isIndexPage) {
+                if(window.sponsoredPodcastDone === undefined || window.sponsoredPodcastDone) {
+                    shouldTrack = true;
+                }
+            } else
+            //on homepage, bottom widget + 2 native widgets
+            if(InfoQConstants.pageType == "HOMEPAGE" && window.finishedVcrOptional1 && window.finishedRelatedVcr && (window.finishedVcrOptional2 === undefined || window.finishedVcrOptional2)) {
+                shouldTrack = true;
+            } else
+            // rightbar widgets + native widgets + content vcr widgets
+            if((InfoQConstants.pageType == "NEWS_PAGE" || InfoQConstants.pageType == "ARTICLE_PAGE")
+                    && ((window.finishedRightbarVcr || window.finishedRightbarVcr === undefined) && window.contentVcrFinished)) {
+                shouldTrack = true;
+            } else if ((InfoQConstants.pageType == "PRESENTATION_PAGE")
+                    && (window.contentVcrFinished || window.contentVcrFinished  === undefined)
+                    && (window.finishedRightbarVcr || window.finishedRightbarVcr  === undefined)
+            ) {
+                shouldTrack = true;
+            } else
+            // native widgets + content widgets
+            if(window.contentVcrFinished && (window.finishedVcrOptional1 || window.finishedVcrOptional1 === undefined)
+                    && (window.finishedVcrOptional2 || window.finishedVcrOptional2 === undefined)) {
+                shouldTrack = true;
+            }
+
+            // we start tracking only after the page is fully loaded, frontend signals that they finished everything related to page display.
+            if(shouldTrack && pageFullyLoaded) {
+                clearInterval(intervalImpressions);
+                Tracker.safeExec(Tracker.doTrackVcrImpressions);
+
+                // start tracking viewable impressions also only after everything is ready
+                function callbackRouter(entries, observer) {
+                    var targets = new Array();
+                    entries.forEach(function (entry) {
+                        var target = entry.target;
+                        if (target.dataset.trkView === 'false') return;
+                        if (entry.intersectionRatio > 0) {
+                            target.dataset.trkView = false;
+                            targets.push(target);
+                        }
+                    });
+                    Tracker.doTrackViewableImpressions(targets);
+                }
+                var elementsForTrackingViewableImpressions = document.querySelectorAll('[data-trk-view="true"]')
+                var observer = new IntersectionObserver(callbackRouter, { threshold: 0.3 });
+                elementsForTrackingViewableImpressions.forEach(observer.observe.bind(observer));
+            }
+
+        }, 500);
+    }
+    $(document).ready(function () {
+        // desktop notifications widget
+        Tracker.encodeNotificationLinks($(".f_notificationWidget"));
+        // mobile notifications widget
+        Tracker.encodeNotificationLinks($(".h_notifications"));
+        // desktop notifications page
+        Tracker.encodeNotificationLinks($(".notification-page"));
+        // mobile notifications page
+        Tracker.encodeNotificationLinks($(".notifications_page"));
+    });
+</script>
+        
+
+
+
+
+
+
+<script type="text/javascript">
+    if(window.location.hash){
+        var hash = window.location.hash.substring(1);
+        if(hash == 'subscribe'){
+            $('html,body').animate({scrollTop: $('.ftxt3 > .newsletter').offset().top}, 'slow');
+        }
+    }
+</script>
+<script type="text/javascript">
+	var newsletterSubscriptionURL ='/newsletter/subscribe.action';
+	DynamicLinks.updateRssLinks('3405691582');
+
+	ContentSummary.setSelectedTab('en');
+	//when user enters the main content area show default topics in the topics bar
+	$("#content-wrapper").mouseenter(function() {	
+	        showDefaultTopics();
+	});
+	
+	
+	Bookmarks.contentTitle = "Programming with Values in Clojure";
+	Bookmarks.apiUrl = '/widgets/bookmark.action';
+    Bookmarks.isContentBookmarked = "false";
+</script>
+<script type="text/javascript"> 
+var $buoop = {vs:{i:6,f:1,o:10.1,s:1}} 
+$buoop.ol = window.onload; 
+$(document).ready(function() {
+	 try {if ($buoop.ol) $buoop.ol();}catch (e) {} 
+	 var e = document.createElement("script"); 
+	 e.setAttribute("type", "text/javascript"); 
+	 e.setAttribute("src", "https://cdn.infoq.com/statics_s1_20260729094803/scripts/lib/browser-update-org/update.js");
+	 document.body.appendChild(e); 
+});
+</script>
+        
+
+        
+            
+            <script>
+                !function(f,b,e,v,n,t,s)
+                {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
+                        n.callMethod.apply(n,arguments):n.queue.push(arguments)};
+                    if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
+                    n.queue=[];t=b.createElement(e);t.async=!0;
+                    t.src=v;s=b.getElementsByTagName(e)[0];
+                    s.parentNode.insertBefore(t,s)}(window,document,'script',
+                        'https://connect.facebook.net/en_US/fbevents.js');
+                fbq('init', '842388869148196');
+                fbq('track', 'PageView');
+            </script>
+            <noscript>
+                <img height="1" width="1" src="https://www.facebook.com/tr?id=842388869148196&ev=PageView&noscript=1"/>
+            </noscript>
+            
+        
+
+            <script type='text/javascript'>
+                try {
+                    mixpanel.track('page viewed', {
+                        'page name' : document.title,
+                        'url' : window.location.pathname
+                    });
+                }
+                catch(err) {
+                }
+            </script>
+    </body>
+</html>
+<!-- s1 -->
diff --git a/archive/techworks/items/infoq-programming-with-values/video.ffprobe.json b/archive/techworks/items/infoq-programming-with-values/video.ffprobe.json
new file mode 100644
index 0000000..587df8b
--- /dev/null
+++ b/archive/techworks/items/infoq-programming-with-values/video.ffprobe.json
@@ -0,0 +1,32 @@
+{
+    "programs": [
+
+    ],
+    "stream_groups": [
+
+    ],
+    "streams": [
+        {
+            "index": 0,
+            "codec_name": "aac",
+            "codec_type": "audio",
+            "sample_rate": "44100",
+            "channels": 2,
+            "r_frame_rate": "0/0"
+        },
+        {
+            "index": 1,
+            "codec_name": "h264",
+            "codec_type": "video",
+            "width": 320,
+            "height": 240,
+            "r_frame_rate": "30000/1001"
+        }
+    ],
+    "format": {
+        "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
+        "duration": "2785.215767",
+        "size": "100330428",
+        "bit_rate": "288179"
+    }
+}
diff --git a/archive/techworks/manifest.tsv b/archive/techworks/manifest.tsv
index 6b65728..3676444 100644
--- a/archive/techworks/manifest.tsv
+++ b/archive/techworks/manifest.tsv
@@ -3,8 +3,8 @@ work_id	artifact_id	title	kind	source_url	local_path	retrieved_utc	sha256	bytes
 2018-09-06-load-testing-shiny-archive	2018-09-06-load-testing-shiny-archive-html	2018-09-06-load-testing-shiny-archive.html	html	repository-preserved-source	md/TechWorks/2018-09-06-load-testing-shiny-archive.html	2026-08-08T00:00:00Z	fcdc53d3785a9eef7989b3fd4b4cb3ec1715015ba61aaa3cf6a8887aa74822c1	114298	public	preserved	
 2018-12-17-CommonLispOrangeCombinator	2018-12-17-commonlisporangecombinator-pdf	2018-12-17-CommonLispOrangeCombinator.pdf	pdf	repository-preserved-source	md/TechWorks/2018-12-17-CommonLispOrangeCombinator.pdf	2026-08-08T00:00:00Z	1e9951de2d98335c45976f7dce0b5429469343eab20a5c17e5d3ed597f1fd7b4	183290	public	preserved	
 2020-01-28-RStudio-Conf-Integration-Testing-ePoster	2020-01-28-rstudio-conf-integration-testing-eposter-pdf	2020-01-28-RStudio-Conf-Integration-Testing-ePoster.pdf	pdf	repository-preserved-source	md/TechWorks/2020-01-28-RStudio-Conf-Integration-Testing-ePoster.pdf	2026-08-08T00:00:00Z	446379435661cd8a75647936a7b4ca130dfdfffb7e5fcc4f767aa11d2f922d13	313663	public	preserved	
-Dipert-FRP_in_ClojureScript_with_Javelin	dipert-frp_in_clojurescript_with_javelin-pdf	Dipert-FRP_in_ClojureScript_with_Javelin.pdf	pdf	repository-preserved-source	md/TechWorks/Dipert-FRP_in_ClojureScript_with_Javelin.pdf	2026-08-08T00:00:00Z	4a2815c9d0b1cf0de5cba85b0b1cf22944a910fb28de1f90afb1e9c50717d987	361367	public	preserved	
-Dipert-ProgrammingWithValues	dipert-programmingwithvalues-pdf	Dipert-ProgrammingWithValues.pdf	pdf	repository-preserved-source	md/TechWorks/Dipert-ProgrammingWithValues.pdf	2026-08-08T00:00:00Z	4bc7e11ed9b4041cbd374ef91f90aee394b10a93c463bd881b58eb41e47a9154	683331	public	preserved	
+infoq-frp-javelin	dipert-frp_in_clojurescript_with_javelin-pdf	FRP in ClojureScript with Javelin slides	pdf	https://videog.infoq.com/downloads/pdfdownloads/presentations/ClojureWest2013-AlanDipert-FRPinClojureScriptwithFlapjax.pdf	md/TechWorks/Dipert-FRP_in_ClojureScript_with_Javelin.pdf	2026-08-08T00:00:00Z	4a2815c9d0b1cf0de5cba85b0b1cf22944a910fb28de1f90afb1e9c50717d987	361367	public	preserved	37-page slide deck named by the InfoQ source page
+infoq-programming-with-values	dipert-programmingwithvalues-pdf	Programming with Values in Clojure slides	pdf	https://videog.infoq.com/downloads/pdfdownloads/presentations/ClojureWEST-AlanDipert-ProgrammingwithValuesinClojure.pdf	md/TechWorks/Dipert-ProgrammingWithValues.pdf	2026-08-08T00:00:00Z	4bc7e11ed9b4041cbd374ef91f90aee394b10a93c463bd881b58eb41e47a9154	683331	public	preserved	36-page slide deck named by the InfoQ source page
 just-lisp-things	authored-jlt-atom-xml	atom.xml	feed	https://tailrecursion.com/jlt/	md/TechWorks/authored/jlt/atom.xml	2026-08-08T00:00:00Z	8bb253146b27ce8a8b08520b0064b0b34659b1460296ffcd69439c53a401ceab	1068	public	preserved	
 just-lisp-things	authored-jlt-code_highlight-css	code_highlight.css	css	https://tailrecursion.com/jlt/	md/TechWorks/authored/jlt/code_highlight.css	2026-08-08T00:00:00Z	a906f29ababff5e39751e14dcd9e14f74545dd3571d5a0f5c41a3c7641af25d2	3489	public	preserved	
 just-lisp-things	authored-jlt-index-html	index.html	html	https://tailrecursion.com/jlt/	md/TechWorks/authored/jlt/index.html	2026-08-08T00:00:00Z	03c08f2783b560406102e762f3763fc4ae31ffd75d13d941c01583ba85160cd3	872	public	preserved	
@@ -106,3 +106,15 @@ clojurestream-s4e19	clojurestream-s4e19-rss-headers	ClojureScript Podcast RSS re
 clojurestream-s4e19	clojurestream-s4e19-rss	ClojureScript Podcast historical RSS feed	metadata	https://web.archive.org/web/20210917044256id_/https://feeds.soundcloud.com/users/soundcloud:users:627190089/sounds.rss	archive/techworks/items/clojurestream-s4-e19/soundcloud-rss-2021.xml	2026-08-09T20:08:58Z	529d418b5641a4389c1f45381cd83410a773232b1abd98d5613f50b80d5faa03	109045	repository-only	preserved	Confirms episode date, duration, exact enclosure URL, and original byte length
 clojurestream-s4e19	clojurestream-s4e19-rss-cdx	ClojureScript Podcast RSS capture index	metadata	https://web.archive.org/cdx/search/cdx?url=feeds.soundcloud.com/users/soundcloud:users:627190089/sounds.rss	archive/techworks/items/clojurestream-s4-e19/soundcloud-rss-cdx.json	2026-08-09T20:08:58Z	f878cc08851e69e0a757b86400729bbe6a3882e875a6330e4f178e58887e713a	12771	repository-only	preserved	Distinct historical RSS feed captures
 clojurestream-s4e19	clojurestream-s4e19-track-metadata	ClojureStream S4 E19 SoundCloud track metadata	metadata	https://soundcloud.com/user-959992602/s4-e19-hoplon-with-alan-dipert	archive/techworks/items/clojurestream-s4-e19/track-metadata.json	2026-08-09T20:08:58Z	53e30a56cab4e4c0e77bb34a6a9fb4ad9604ef15939726d992e0e8b581bf1b1d	5677	repository-only	preserved	Exact embedded track object extracted from the original page capture
+infoq-frp-javelin	infoq-frp-javelin-video	FRP in ClojureScript with Javelin original video	video	https://videoh.infoq.com/presentations/13-mar-frpinclojurescript.mp4	md/TechWorks/media/video/infoq-frp-javelin.mp4	2026-08-09T20:32:01Z	a14dc4ce3d83b1688b13575405f6b2d725d508fa1551d8ebd0b5a81a0b9de46a	108590986	public	preserved	Original InfoQ H.264/AAC MP4; 320x240 at 30000/1001 fps; no transcoding
+infoq-frp-javelin	infoq-frp-javelin-audio	FRP in ClojureScript with Javelin original audio	audio	https://videoh.infoq.com/downloads/mp3downloads/presentations/infoq-13-mar-frpinclojurescript.mp3	md/TechWorks/media/audio/infoq-frp-javelin.mp3	2026-08-09T20:32:01Z	c41eb86d39e4e8b46b3340d43b67ef62908132bb62cf81b8d8b66d6665ba5e55	37650079	public	preserved	Original separately published 128 kbps stereo MP3; no transcoding
+infoq-frp-javelin	infoq-frp-javelin-source	FRP in ClojureScript with Javelin source page	web-page	https://www.infoq.com/presentations/ClojureScript-Javelin/	archive/techworks/items/infoq-frp-javelin/source.html	2026-08-09T20:32:01Z	f413f0be7acdb4780a2698c2f1b363a5d656cb4b3635cd0352c30a4cd4f0be19	156395	repository-only	preserved	Exact live page except transient player authorization values are explicitly redacted
+infoq-frp-javelin	infoq-frp-javelin-headers	FRP in ClojureScript with Javelin response headers	metadata	https://www.infoq.com/presentations/ClojureScript-Javelin/	archive/techworks/items/infoq-frp-javelin/source.headers	2026-08-09T20:32:01Z	d18e8f815f977dec70111afd99457a3f488f516df3e0ffd05015d52b9a8ef05d	515	repository-only	preserved	HTTP response metadata with transient Set-Cookie fields omitted
+infoq-frp-javelin	infoq-frp-javelin-video-metadata	FRP in ClojureScript with Javelin video stream metadata	metadata	https://videoh.infoq.com/presentations/13-mar-frpinclojurescript.mp4	archive/techworks/items/infoq-frp-javelin/video.ffprobe.json	2026-08-09T20:32:01Z	8dad6ca17579e26ec0c9a1c09ef6a5d2e7a405bbd0f16e7d54f8e66c425c7909	667	repository-only	preserved	ffprobe stream and container metadata
+infoq-frp-javelin	infoq-frp-javelin-audio-metadata	FRP in ClojureScript with Javelin audio stream metadata	metadata	https://videoh.infoq.com/downloads/mp3downloads/presentations/infoq-13-mar-frpinclojurescript.mp3	archive/techworks/items/infoq-frp-javelin/audio.ffprobe.json	2026-08-09T20:32:01Z	37bd6847601d6bb5c25639fa100b9d0db33a3694679ea780761ab1c417249ccf	438	repository-only	preserved	ffprobe stream and container metadata
+infoq-programming-with-values	infoq-programming-with-values-video	Programming with Values in Clojure original video	video	https://videoh.infoq.com/presentations/12-mar-valuesinclojure.mp4	md/TechWorks/media/video/infoq-programming-with-values.mp4	2026-08-09T20:32:01Z	733ec4b8005a8be7d96d2ba7daf76263066c9d49c095a1fb6232e7638e4d6adc	100330428	public	preserved	Original InfoQ H.264/AAC MP4; 320x240 at 30000/1001 fps; no transcoding
+infoq-programming-with-values	infoq-programming-with-values-audio	Programming with Values in Clojure original audio	audio	https://videoh.infoq.com/downloads/mp3downloads/presentations/infoq-12-mar-valuesinclojure.mp3	md/TechWorks/media/audio/infoq-programming-with-values.mp3	2026-08-09T20:32:01Z	d977b0b3706d214f78878695dc9c7870d3ee78bc639f9f5b5774d051a8367df8	44659255	public	preserved	Original separately published 128 kbps stereo MP3; no transcoding
+infoq-programming-with-values	infoq-programming-with-values-source	Programming with Values in Clojure source page	web-page	https://www.infoq.com/presentations/Programming-with-Values-in-Clojure/	archive/techworks/items/infoq-programming-with-values/source.html	2026-08-09T20:32:01Z	3499a6da9bdce3dd105c4f8faf8bdcb7310f3bc64deb09096c8f5937518e40cc	156030	repository-only	preserved	Exact live page except transient player authorization values are explicitly redacted
+infoq-programming-with-values	infoq-programming-with-values-headers	Programming with Values in Clojure response headers	metadata	https://www.infoq.com/presentations/Programming-with-Values-in-Clojure/	archive/techworks/items/infoq-programming-with-values/source.headers	2026-08-09T20:32:01Z	2119a64870a684d6f0e67527129948096aab553aa08da38503200ec85f11c11f	515	repository-only	preserved	HTTP response metadata with transient Set-Cookie fields omitted
+infoq-programming-with-values	infoq-programming-with-values-video-metadata	Programming with Values in Clojure video stream metadata	metadata	https://videoh.infoq.com/presentations/12-mar-valuesinclojure.mp4	archive/techworks/items/infoq-programming-with-values/video.ffprobe.json	2026-08-09T20:32:01Z	268c30cc7e1400e9e8b9d5d1b6d8e19cf53291de68b0adda0847bc0b09e50732	667	repository-only	preserved	ffprobe stream and container metadata
+infoq-programming-with-values	infoq-programming-with-values-audio-metadata	Programming with Values in Clojure audio stream metadata	metadata	https://videoh.infoq.com/downloads/mp3downloads/presentations/infoq-12-mar-valuesinclojure.mp3	archive/techworks/items/infoq-programming-with-values/audio.ffprobe.json	2026-08-09T20:32:01Z	b720141f594781805b58b0cf682a2aa6227d358df9b5ef27d1fd711737437ea9	438	repository-only	preserved	ffprobe stream and container metadata
diff --git a/md/TechWorks/media/audio/infoq-frp-javelin.mp3 b/md/TechWorks/media/audio/infoq-frp-javelin.mp3
new file mode 100644
index 0000000..7739d31
--- /dev/null
+++ b/md/TechWorks/media/audio/infoq-frp-javelin.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c41eb86d39e4e8b46b3340d43b67ef62908132bb62cf81b8d8b66d6665ba5e55
+size 37650079
diff --git a/md/TechWorks/media/audio/infoq-programming-with-values.mp3 b/md/TechWorks/media/audio/infoq-programming-with-values.mp3
new file mode 100644
index 0000000..918abc7
--- /dev/null
+++ b/md/TechWorks/media/audio/infoq-programming-with-values.mp3
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d977b0b3706d214f78878695dc9c7870d3ee78bc639f9f5b5774d051a8367df8
+size 44659255
diff --git a/md/TechWorks/media/video/infoq-frp-javelin.mp4 b/md/TechWorks/media/video/infoq-frp-javelin.mp4
new file mode 100644
index 0000000..91e758e
--- /dev/null
+++ b/md/TechWorks/media/video/infoq-frp-javelin.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a14dc4ce3d83b1688b13575405f6b2d725d508fa1551d8ebd0b5a81a0b9de46a
+size 108590986
diff --git a/md/TechWorks/media/video/infoq-programming-with-values.mp4 b/md/TechWorks/media/video/infoq-programming-with-values.mp4
new file mode 100644
index 0000000..9044a11
--- /dev/null
+++ b/md/TechWorks/media/video/infoq-programming-with-values.mp4
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:733ec4b8005a8be7d96d2ba7daf76263066c9d49c095a1fb6232e7638e4d6adc
+size 100330428
diff --git a/md/TechWorksArchive.md b/md/TechWorksArchive.md
index c0a9eee..752dada 100644
--- a/md/TechWorksArchive.md
+++ b/md/TechWorksArchive.md
@@ -34,6 +34,8 @@ These are the best available copies from the original hosts. Captions are includ
 | Uberlisp lightning talk | [Video](./TechWorks/media/video/tSw3x0rVh88.mp4) | [English](./TechWorks/media/video/tSw3x0rVh88.en.vtt) |
 | Web Programming with Hoplon | [Video](./TechWorks/media/video/wVXjExRiFy0.mp4) | [English](./TechWorks/media/video/wVXjExRiFy0.en.vtt) |
 | Flapjax lightning talk | [Video](./TechWorks/media/video/xaxF5RDdVRE.mp4) | [English](./TechWorks/media/video/xaxF5RDdVRE.en.vtt) |
+| FRP in ClojureScript with Javelin | [Video](./TechWorks/media/video/infoq-frp-javelin.mp4), [audio](./TechWorks/media/audio/infoq-frp-javelin.mp3), [slides](./TechWorks/Dipert-FRP_in_ClojureScript_with_Javelin.pdf) | Not published |
+| Programming with Values in Clojure | [Video](./TechWorks/media/video/infoq-programming-with-values.mp4), [audio](./TechWorks/media/audio/infoq-programming-with-values.mp3), [slides](./TechWorks/Dipert-ProgrammingWithValues.pdf) | Not published |
 
 ## Podcasts