Home liberachat/#haskell: Logs Calendar

Logs on 2026-01-23 (liberachat/#haskell)

00:00:06 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
00:10:11 <EvanR> the answer the question, certain patterns of recursion can be encapulsated in combinators that magically have the same effect
00:10:13 <EvanR> to
00:10:31 <EvanR> e.g. map and fold
00:10:42 <EvanR> they can't do everything, but the more such tools you have the more you can do
00:10:58 <EvanR> but sometimes explicit recursion makes more sense
00:11:28 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
00:16:39 <probie> how are imperative languages without goto supposed to be useful?
00:16:39 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
00:25:31 Zemy_ joins (~Zemy@2600:100c:b0ab:ed8b:c474:c7ff:febb:8ed3)
00:27:14 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
00:28:13 × Zemy quits (~Zemy@72.178.108.235) (Ping timeout: 246 seconds)
00:32:00 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
00:33:28 × trickard_ quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
00:33:42 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
00:43:02 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
00:48:16 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
00:51:32 Zemy joins (~Zemy@syn-192-154-181-091.biz.spectrum.com)
00:55:54 × Zemy_ quits (~Zemy@2600:100c:b0ab:ed8b:c474:c7ff:febb:8ed3) (Ping timeout: 260 seconds)
00:56:13 × Square3 quits (~Square4@user/square) (Ping timeout: 246 seconds)
00:58:49 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
01:01:45 Zemy_ joins (~Zemy@2600:100c:b0ab:ed8b:9876:2aff:fe33:1a1d)
01:03:37 × Zemy quits (~Zemy@syn-192-154-181-091.biz.spectrum.com) (Ping timeout: 264 seconds)
01:03:49 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 250 seconds)
01:05:55 <systemfault> for loops/while/etc...
01:07:45 humasect joins (~humasect@dyn-192-249-132-90.nexicom.net)
01:08:40 <jackdk> I think probie is asking rhetorically, to provide an analogous question/answer pair to chromoblob/EvanR.
01:08:58 <EvanR> lol
01:09:57 <EvanR> clearly systemfault is answering in such a way intentionally to highlight the irony
01:10:53 <EvanR> this is what it's like in the tiplerian omega point simulation where everyone already knows everything anyone could talk about
01:11:35 <systemfault> Yeah... that said, I don't know what a tiplerian omega point simulation is...
01:13:14 <geekosaur> sounds to me like someone's been tippling on physics 🙂
01:14:37 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
01:15:37 × xff0x quits (~xff0x@2405:6580:b080:900:52f9:378c:6eea:47d5) (Ping timeout: 265 seconds)
01:17:50 × Pozyomka_ quits (~pyon@user/pyon) (Ping timeout: 245 seconds)
01:19:41 Pozyomka joins (~pyon@user/pyon)
01:19:49 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
01:21:54 × ljdarj quits (~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds)
01:30:02 Zemy joins (~Zemy@72.178.108.235)
01:30:17 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
01:31:59 × Zemy_ quits (~Zemy@2600:100c:b0ab:ed8b:9876:2aff:fe33:1a1d) (Ping timeout: 250 seconds)
01:35:26 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
01:39:37 × Square2 quits (~Square@user/square) (Ping timeout: 264 seconds)
01:42:24 × Inline quits (~User@2001-4dd7-bc56-0-fdb7-c703-fc72-e0a.ipv6dyn.netcologne.de) (Ping timeout: 252 seconds)
01:43:44 omidmash3 joins (~omidmash@user/omidmash)
01:45:34 × omidmash quits (~omidmash@user/omidmash) (Ping timeout: 246 seconds)
01:45:34 omidmash3 is now known as omidmash
01:46:04 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
01:50:36 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
01:54:36 Inline joins (~User@2001-4dd7-bc56-0-bf4e-84aa-8c9c-590c.ipv6dyn.netcologne.de)
02:01:29 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
02:08:07 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds)
02:10:07 <Leary> chromoblob: Write all your co/inductive co/data types in greatest/least-fixed-point form, and all your logic in folds. It's not even as bad as it sounds!
02:11:43 × humasect quits (~humasect@dyn-192-249-132-90.nexicom.net) (Quit: Leaving...)
02:13:51 xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
02:19:31 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
02:24:25 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
02:33:01 <jackdk> Reminds me of Dhall
02:35:18 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
02:40:12 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
02:41:30 terrorjack joins (~terrorjac@2a01:4f8:c17:9d11::)
02:41:32 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 244 seconds)
02:43:36 vanishingideal joins (~vanishing@user/vanishingideal)
02:47:59 <Leary> It should; Haskell sans recursion ~ System F ~ Dhall.
02:51:54 × omidmash quits (~omidmash@user/omidmash) (Quit: The Lounge - https://thelounge.chat)
02:52:25 × mange quits (~mange@user/mange) (Quit: Quittin' time!)
02:53:09 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
02:53:09 trickard_ is now known as trickard
02:55:29 omidmash joins (~omidmash@user/omidmash)
02:57:25 × haskellbridge quits (~hackager@96.28.224.214) (Remote host closed the connection)
02:57:40 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
02:57:59 haskellbridge joins (~hackager@96.28.224.214)
02:57:59 ChanServ sets mode +v haskellbridge
03:08:31 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
03:13:49 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
03:22:02 notzmv joins (~umar@user/notzmv)
03:23:03 × haskellbridge quits (~hackager@96.28.224.214) (Remote host closed the connection)
03:24:18 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
03:26:58 × foul_owl quits (~kerry@94.156.149.99) (Ping timeout: 260 seconds)
03:29:43 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
03:34:12 haskellbridge joins (~hackager@96.28.224.214)
03:34:12 ChanServ sets mode +v haskellbridge
03:38:57 Googulator26 is now known as Googulator
03:40:05 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
03:41:09 foul_owl joins (~kerry@94.156.149.91)
03:45:05 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
03:45:26 <haskellbridge> <Zemyla> You can even zip lists by folding over both of them.
03:51:58 × rotcev quits (~rotcev@user/rotcev) (Quit: Client closed)
03:53:28 chenjf joins (~chenjf@68.64.178.54)
03:55:05 <monochrom> Belated: My hot take: How are languages without call/cc or at least shift/reset supposed to be useful? >:)
03:55:07 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 265 seconds)
03:55:34 × chenjf quits (~chenjf@68.64.178.54) (Client Quit)
03:55:54 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
03:58:30 × leah2 quits (~leah@vuxu.org) (Ping timeout: 265 seconds)
04:00:19 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
04:04:31 × notzmv quits (~umar@user/notzmv) (Ping timeout: 264 seconds)
04:11:16 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
04:16:13 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 250 seconds)
04:16:35 × machinedgod quits (~machinedg@d75-159-126-101.abhsia.telus.net) (Ping timeout: 245 seconds)
04:17:51 <probie> Zemyla: You don't need to fold over both them, just one
04:23:07 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
04:23:20 <probie> > let zip' = foldr (\x k ys -> case ys of { [] -> []; y:ys' -> (x,y):k ys' }) (const []) in zip' "hello" "world!"
04:23:21 <lambdabot> [('h','w'),('e','o'),('l','r'),('l','l'),('o','d')]
04:24:15 × sp1ff` quits (~user@2601:1c2:4701:900::32d4) (Read error: Connection reset by peer)
04:24:52 sp1ff` joins (~user@2601:1c2:4701:900::32d4)
04:28:08 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
04:29:11 <ncf> well, case ys is a fold, just not a recursive one
04:31:54 × trickard quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
04:32:05 <probie> It's a lesser fold. A crease? :p
04:32:08 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
04:32:22 peterbecich joins (~Thunderbi@71.84.33.135)
04:33:16 <ncf> i will concede 'a ply'
04:38:32 × sp1ff` quits (~user@2601:1c2:4701:900::32d4) (Read error: Connection reset by peer)
04:38:54 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
04:39:13 sp1ff` joins (~user@2601:1c2:4701:900::32d4)
04:43:59 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 260 seconds)
04:48:55 × dutchie quits (~dutchie@user/dutchie) (Ping timeout: 264 seconds)
04:50:14 × peterbecich quits (~Thunderbi@71.84.33.135) (Ping timeout: 256 seconds)
04:50:48 × chromoblob quits (~chromoblo@user/chromob1ot1c) (Ping timeout: 256 seconds)
04:51:25 chromoblob joins (~chromoblo@user/chromob1ot1c)
04:54:42 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
04:54:50 <haskellbridge> <Zemyla> @let newtype Z a b = Z { runZ :: a -> (Z a b -> b) -> b }
04:55:20 <haskellbridge> <Zemyla> Apparently lambdabot doesn't like the bridge.
04:58:31 × chromoblob quits (~chromoblo@user/chromob1ot1c) (Read error: Connection reset by peer)
05:00:29 chromoblob joins (~chromoblo@user/chromob1ot1c)
05:01:49 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
05:10:50 <probie> Zemyla: try putting a blank line before what you want to feed to lambdabot
05:12:44 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
05:15:11 <chromoblob> Leary: could you elaborate, maybe give an example?
05:15:51 <probie> If you send "foo\nbar" it should come through as "<haskellbridge> <Zemyla> foo\n<haskellbridge> bar", so the second line should come through as a separate message, without your username in front and will be picked up by lambdabot or yahb2
05:16:33 × Googulator quits (~Googulato@2a01-036d-0106-030a-8d41-f550-2a4f-1a91.pool6.digikabel.hu) (Quit: Client closed)
05:16:44 Googulator joins (~Googulato@2a01-036d-0106-030a-8d41-f550-2a4f-1a91.pool6.digikabel.hu)
05:17:25 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
05:18:03 dutchie joins (~dutchie@user/dutchie)
05:22:44 lewisbrown joins (~user@user/lewisbrown)
05:25:16 leah2 joins (~leah@vuxu.org)
05:28:33 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
05:33:25 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
05:36:43 michalz joins (~michalz@185.246.207.203)
05:44:22 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
05:45:15 peterbecich joins (~Thunderbi@71.84.33.135)
05:48:56 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds)
05:49:46 humasect joins (~humasect@dyn-192-249-132-90.nexicom.net)
05:57:25 × housemate quits (~housemate@202.7.248.67) (Quit: https://ineedsomeacidtocalmmedown.space/)
05:58:54 takuan joins (~takuan@d8D86B9E9.access.telenet.be)
06:00:07 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
06:03:25 housemate joins (~housemate@202.7.248.67)
06:03:54 × Googulator quits (~Googulato@2a01-036d-0106-030a-8d41-f550-2a4f-1a91.pool6.digikabel.hu) (Quit: Client closed)
06:04:06 Googulator joins (~Googulato@2a01-036d-0106-030a-8d41-f550-2a4f-1a91.pool6.digikabel.hu)
06:05:25 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
06:07:29 weary-traveler joins (~user@user/user363627)
06:14:00 notzmv joins (~umar@user/notzmv)
06:15:55 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
06:18:07 × jmcantrell quits (~weechat@user/jmcantrell) (Ping timeout: 240 seconds)
06:20:35 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 250 seconds)
06:22:59 <Leary> chromoblob: https://gist.github.com/LSLeary/0247b813ad063409d4d09eccc5b077e0
06:24:11 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
06:25:14 trickard_ is now known as trickard
06:28:56 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds)
06:31:30 <haskellbridge> <Bowuigi> Related https://github.com/sellout/no-recursion
06:39:55 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
06:46:34 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
06:47:43 <probie> recursion-schemes gives you general recursion anyway
06:49:49 × trickard quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
06:50:02 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
06:50:10 <Leary> "recursion schemes" /= "recursion-schemes"
06:57:57 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
07:02:50 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
07:06:24 × tzh quits (~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz)
07:12:54 × trickard_ quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
07:13:07 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
07:13:44 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
07:18:32 × trickard_ quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
07:18:39 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 250 seconds)
07:21:45 × tomboy64 quits (~tomboy64@user/tomboy64) (Ping timeout: 252 seconds)
07:23:24 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
07:23:28 <ncf> if you're not allergic to general recursion you can do the exact same thing using just one data type and no impredicative encodings https://gist.github.com/ncfavier/d42d077745c73dfb2e2c58592b1cd7e1
07:24:04 tomboy64 joins (~tomboy64@user/tomboy64)
07:24:51 <ncf> (note that general recursion is used rather controlledly here, in `fold` and `unfold`, so you could make those abstract and pretend they are primitives)
07:25:07 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
07:29:58 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds)
07:40:55 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
07:44:06 danza joins (~danza@user/danza)
07:45:54 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
07:48:32 × peterbecich quits (~Thunderbi@71.84.33.135) (Ping timeout: 240 seconds)
07:53:02 × humasect quits (~humasect@dyn-192-249-132-90.nexicom.net) (Quit: Leaving...)
07:56:21 × Googulator quits (~Googulato@2a01-036d-0106-030a-8d41-f550-2a4f-1a91.pool6.digikabel.hu) (Ping timeout: 272 seconds)
07:56:42 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
07:56:46 sord937 joins (~sord937@gateway/tor-sasl/sord937)
08:01:27 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
08:03:40 oskarw joins (~user@user/oskarw)
08:06:01 × xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 246 seconds)
08:08:04 xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
08:08:39 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
08:10:49 × FANTOM quits (~fantom@87.75.185.177) (Read error: Connection reset by peer)
08:13:20 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
08:21:24 Lycurgus joins (~juan@user/Lycurgus)
08:24:26 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
08:31:13 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
08:35:27 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
08:40:57 × AlexZenon quits (~alzenon@94.233.241.51) (Ping timeout: 252 seconds)
08:42:04 <Leary> ncf: That fails to encapsulate general recursion since it's easily recoverable in the form of `fix :: (a -> a) -> a`, though perhaps if we also disallowed bottoms that wouldn't be the case.
08:42:25 × AlexNoo quits (~AlexNoo@94.233.241.51) (Ping timeout: 246 seconds)
08:42:36 × Alex_delenda_est quits (~al_test@94.233.241.51) (Ping timeout: 252 seconds)
08:43:43 trickard_ is now known as trickard
08:50:04 <gentauro> jackdk: thx for links and info. It's a bit sad that `eXchange` lost all their IP when they went bankrupt and now the few surviving videos look like they were recorded with a toaster :'(
08:50:34 <jackdk> Yeah it's such a shame. Though I don't think that particular talk ever had a good recording
08:50:55 <gentauro> I actually tried to "re-spawn" the hole concept of `eXchange` again as they were bought by Trifork. I made slides and stuff and provided all the "nice" names
08:51:16 <gentauro> then suddently, you see all those names at "GOTO Conferences" (yeah Trifork also own them)
08:51:46 <int-e> I know it was a typo, but "hole concept" is pretty accurate (think "memory hole")
08:51:48 <gentauro> never EVER trust `corpos`. It's just a matter of if, but when, they will screw you :(
08:53:04 × haritz quits (~hrtz@user/haritz) (Quit: ZNC 1.8.2+deb3.1+deb12u1 - https://znc.in)
08:53:08 <gentauro> the good thing? At least they bring "the names" to mainstream -> https://www.youtube.com/watch?v=lg0RYLlmjJM
08:53:13 <gentauro> ;)
08:53:54 <gentauro> and good old Kris -> https://www.youtube.com/watch?v=SOz66dcsuT8
08:54:54 <gentauro> Elm Evan -> https://www.youtube.com/watch?v=TklYhw0Kl58 (btw, does anybody know if that `lang` is `dead`?)
09:01:16 × sord937 quits (~sord937@gateway/tor-sasl/sord937) (Ping timeout: 252 seconds)
09:02:18 sord937 joins (~sord937@gateway/tor-sasl/sord937)
09:02:56 × acidjnk quits (~acidjnk@p200300d6e7171963e9342c1b23054bda.dip0.t-ipconnect.de) (Ping timeout: 244 seconds)
09:16:08 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
09:19:22 × xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 244 seconds)
09:21:17 xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
09:23:48 × housemate quits (~housemate@202.7.248.67) (Remote host closed the connection)
09:24:40 housemate joins (~housemate@202.7.248.67)
09:25:19 × housemate quits (~housemate@202.7.248.67) (Remote host closed the connection)
09:25:25 Googulator joins (~Googulato@team.broadbit.hu)
09:25:38 chele joins (~chele@user/chele)
09:26:31 housemate joins (~housemate@202.7.248.67)
09:26:58 machinedgod joins (~machinedg@d75-159-126-101.abhsia.telus.net)
09:27:17 × housemate quits (~housemate@202.7.248.67) (Max SendQ exceeded)
09:27:18 skum joins (~skum@user/skum)
09:29:30 housemate joins (~housemate@202.7.248.67)
09:30:01 CiaoSen joins (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db)
09:30:11 × housemate quits (~housemate@202.7.248.67) (Max SendQ exceeded)
09:30:37 × xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 264 seconds)
09:30:41 housemate joins (~housemate@202.7.248.67)
09:31:09 × housemate quits (~housemate@202.7.248.67) (Remote host closed the connection)
09:31:38 housemate joins (~housemate@202.7.248.67)
09:31:43 × housemate quits (~housemate@202.7.248.67) (Remote host closed the connection)
09:32:29 xff0x joins (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
09:33:37 <bwe> How can I let wai / warp update an internal data cache regularly by querying some database (no, I don’t mean response cache)?
09:33:41 XZDX joins (~xzdx@2601:404:ce00:b795:214:51ff:fe83:9855)
09:35:33 × XZDX quits (~xzdx@2601:404:ce00:b795:214:51ff:fe83:9855) (Changing host)
09:35:33 XZDX joins (~xzdx@user/XZDX)
09:48:07 × Googulator quits (~Googulato@team.broadbit.hu) (Quit: Client closed)
09:50:47 vanishingideal joins (~vanishing@user/vanishingideal)
10:04:00 × fp quits (~Thunderbi@2001-14ba-6e24-3000--198.rev.dnainternet.fi) (Ping timeout: 252 seconds)
10:05:10 <danza> are you sure that is the right level of abstraction? Wai/warp sound too close to the server for a cache that has to query a database
10:05:50 × xff0x quits (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) (Ping timeout: 265 seconds)
10:06:32 __monty__ joins (~toonn@user/toonn)
10:07:29 <[exa]> bwe: can you be more specific on "internal data cache"? (does wai have a cache?)
10:12:56 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 240 seconds)
10:13:49 <danza> data-based contents would be provided at application level, but it's tricky to cache because database contents can change
10:14:20 × trickard quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
10:14:32 trickard joins (~trickard@cpe-93-98-47-163.wireline.com.au)
10:17:09 ljdarj joins (~Thunderbi@user/ljdarj)
10:25:39 Googulator joins (~Googulato@team.broadbit.hu)
10:28:03 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Read error: Connection reset by peer)
10:28:10 merijn joins (~merijn@77.242.116.146)
10:30:55 × hellwolf quits (~user@4cde-2438-8978-87b1-0f00-4d40-07d0-2001.sta.estpak.ee) (Ping timeout: 264 seconds)
10:30:59 Square2 joins (~Square@user/square)
10:34:47 <bwe> [exa]: I currently load data when the web server starts. It hands over the data to hyperbole web framework in a Reader context through Effectful. What I want is that it loads it all 3 minutes for example without reloading the web server altogether.
10:35:52 Googulator23 joins (~Googulato@team.broadbit.hu)
10:35:58 <[exa]> bwe: you can have a MVar in the Reader that points to data, and replace it every now and then from a completely independent thread?
10:35:59 <bwe> danza: So, the internal data cache actually lies in the hyperbole framework. But I pull it only in on start of warp.
10:36:34 <[exa]> (I'm not very sure how hyperbole works but if you use Reader, pushing in the MVar shouldn't be a big issue.)
10:37:16 <bwe> [exa]: Well, if I get you right, that is similar to what I thought. "How can I update some thing in a different thread from another (that just sleeps between updates)?"
10:38:43 <bwe> danza: I am quite tolerant for outdated database states within a range of up to 3 minutes (update time of my internal cache).
10:39:00 <[exa]> bwe: yeah MVars are great for that, loading them doesn't cost anything and you can atomically flip to the new state
10:39:45 × Googulator quits (~Googulato@team.broadbit.hu) (Ping timeout: 272 seconds)
10:40:33 <danza> but they should have one MVar per query? Anyway yes, sounds like something better solved in hyperbole
10:41:14 hellwolf joins (~user@e7d0-28a4-0ea3-c496-0f00-4d40-07d0-2001.sta.estpak.ee)
10:46:35 fp joins (~Thunderbi@2001:708:20:1406::10c5)
10:47:20 <bwe> ...and I thought data stored in Reader doesn't change (once loaded).
10:49:11 <bwe> Then MVar is nothing but a (changeable) State across different threads, does that mean different binaries? How do they find them each other, then?
10:50:48 <__monty__> Threads don't imply different binaries. They don't even imply different processes. Rather the reverse.
10:54:04 <mauke> :t forkIO
10:54:05 <lambdabot> error: [GHC-88464] Variable not in scope: forkIO
10:54:18 <[exa]> bwe: yeah technically the "variable" reference doesn't change, but you're allowed to rewrite what's it pointing to
10:57:02 <bwe> __monty__: So, when I start the web server, I need to fork from that the runner that updates the MVar. That would work while different binary doesn't, right?
10:57:11 × trickard quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
10:57:20 × XZDX quits (~xzdx@user/XZDX) (Remote host closed the connection)
10:57:25 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
10:59:39 × thenightmail quits (~thenightm@user/thenightmail) (Ping timeout: 260 seconds)
11:00:04 thenightmail joins (~thenightm@user/thenightmail)
11:00:20 × oskarw quits (~user@user/oskarw) (Remote host closed the connection)
11:01:05 lantti joins (~lantti@xcalibur.cc.tut.fi)
11:01:43 oskarw joins (~user@user/oskarw)
11:04:01 <__monty__> I'm not sure. mauke seems to suggest using forkIO.
11:04:48 vanishingideal joins (~vanishing@user/vanishingideal)
11:06:19 <mauke> if we're just updating a data structure that someone else reads from and no other interaction, wouldn't an IORef suffice?
11:07:39 <mauke> https://hackage-content.haskell.org/package/base-4.22.0.0/docs/Data-IORef.html#v:atomicModifyIORef
11:08:38 <__monty__> Does an MVar have that much more overhead that the footgun factor is worth it?
11:08:55 <tomsmeding> an MVar definitely has much more overhead than an IORef
11:09:04 <mauke> footgun how?
11:09:19 <tomsmeding> it's a lock with an explicit queue attached (a list of threads waiting to take the lock) for fairness
11:09:33 <tomsmeding> atomicModifyIORef is little more than a single CPU instruction (compare-and-swap)
11:09:49 <tomsmeding> whether this is important in the application depends on how often you do this, of course
11:13:15 <tomsmeding> in return for the overhead, an MVar gives you 1. fairness (if you're blocking on the MVar and no one holds the MVar indefinitely, you're guaranteed to get it eventually), 2. the ability to do IO while holding the lock
11:13:27 housemate joins (~housemate@2405:6e00:2457:9d18:a3e8:cd50:91c3:2f91)
11:15:59 <tomsmeding> also 3. an MVar can also function as a one-place channel instead of a lock
11:16:25 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 246 seconds)
11:18:55 <danza> well that sounds saner to me for the goal
11:27:28 × Square2 quits (~Square@user/square) (Ping timeout: 256 seconds)
11:28:06 × housemate quits (~housemate@2405:6e00:2457:9d18:a3e8:cd50:91c3:2f91) (Quit: https://ineedsomeacidtocalmmedown.space/)
11:29:21 <__monty__> mauke: The footgun is thinking you'll be able to just add another IORef later and not run into trouble.
11:30:26 <mauke> applies to MVar, too
11:30:30 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
11:31:45 <__monty__> So the doc suggesting MVars instead is misleading?
11:32:46 <mauke> well, it only talks about atomicity
11:32:56 <mauke> with MVars you can deadlock instead
11:33:06 <int-e> "Extending the atomicity to multiple IORefs is problematic, so it is recommended that if you need to do anything more complicated then using MVar instead is a good idea."
11:33:19 <int-e> If that's what you mean I don't know how it's misleading.
11:34:47 × Inline quits (~User@2001-4dd7-bc56-0-bf4e-84aa-8c9c-590c.ipv6dyn.netcologne.de) (Quit: KVIrc 5.2.6 Quasar http://www.kvirc.net/)
11:34:48 danz20169 joins (~danza@user/danza)
11:35:37 <__monty__> Well, it suggests you can extend atomicity across multiple, no? So if you can't do that easily without deadlocking it's not a great suggestion.
11:36:31 <Axman6> you just have to be careful about the order you access things
11:36:36 <int-e> You can't atomically update two IORefs at the same time.
11:36:43 trickard_ is now known as trickard
11:36:44 <Axman6> IIRC MVar has a consistent Ord instance?
11:37:06 × danza quits (~danza@user/danza) (Ping timeout: 256 seconds)
11:37:25 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 255 seconds)
11:37:42 <Axman6> IORefs with atomicModifyIORef are amazing, if you can store all your state in pure data structures that can always be changed without doing any other IO. if you can't guarantee those properties, other options are much safer
11:37:47 <int-e> (But you can have a single IORef that stores a tuple or a record.)
11:39:04 <Axman6> I've been reading a lot of the Cardano code recently, and they make a lot of use of STM, as well as pure data structures.
11:39:05 <mauke> or a Map
11:39:57 <Axman6> they can store an arbitrarily complicated record too, and aMIOref can be used to update as much or as little of that structure as you like
11:40:19 <mauke> I had a server that would answer client queries from a central data structure (a Map stored in an IORef)
11:40:41 <mauke> there was a writer thread that would occasionally update the structure by just overwriting the Map
11:41:08 <mauke> worked great
11:41:34 <Axman6> I have also done that - it needed to serve images of some live-ish data, and generating the images was pretty slow, so with each new piece of data it'd just make new PNGs and update the map in the IORef. Meant all the HTTP requests were instant
11:43:10 <danz20169> seems a solution suited to server-side data vis
11:44:39 <danz20169> did you use any library to encode PNGs as types?
11:45:34 <danz20169> maybe just passed them as black boxes
11:48:20 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
11:49:47 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Read error: Connection reset by peer)
11:50:41 × Googulator23 quits (~Googulato@team.broadbit.hu) (Ping timeout: 272 seconds)
11:51:27 <tomsmeding> __monty__: while yes, adding another IORef later means you can't update both in the same atomic transaction, I'm not sure what part of the API would lead one to assume that you can
11:52:03 <tomsmeding> if anything, having to order locks to avoid deadlock is a more insidious risk that you may not see coming if you haven't studied concurrent programming
11:52:41 <__monty__> You may be right.
11:53:01 <tomsmeding> (for completeness: you have two locks, A and B, and two threads, 1 and 2. 1 locks A and then B, and 2 locks B and then A. If the two executions interleave, 1 has A locked and 2 has B locked and they both wait on the other, indefinitely)
11:53:20 merijn joins (~merijn@77.242.116.146)
11:53:23 <tomsmeding> (if you only ever lock such locks in a particular global order, this problem cannot arise)
11:53:26 <int-e> You can perhaps criticize the IORef docs for not mentioning STM, but the reason for that is probably historical, and you'll find out about STM when you read the MVar docs.
11:56:14 <tomsmeding> and if you are worried about performance implications of using an MVar over an IORef, you should also be worried about STM, as it similar (?) overhead, and also has starvation issues if you have very long and also very short transactions that update the same TVars
11:56:28 <tomsmeding> *as it has similar
11:56:51 fp1 joins (~Thunderbi@2001:708:150:10::9d7e)
11:57:16 <int-e> Do we have any canonical STM horror story (along the lines of "it worked great until we ran it in production with 50 simultaneous threads and then it spent 90% of its time retrying STM transactions"?)
11:57:22 <tomsmeding> concurrent programming: correct, fast, convenient; pick 2
11:57:27 <ncf> Leary: i didn't mean to encapsulate general recursion tbh, only to point out that the clarity of expressing things in terms of (co)algebras needn't come at the price of general recursion
11:57:29 × fp quits (~Thunderbi@2001:708:20:1406::10c5) (Ping timeout: 265 seconds)
11:57:29 fp1 is now known as fp
11:57:54 <tomsmeding> int-e: I'm not aware of any, I'm an academic
12:00:51 <tomsmeding> Axman6: MVar doesn't implement Ord, only Eq
12:01:37 Googulator23 joins (~Googulato@team.broadbit.hu)
12:03:09 <tomsmeding> (you may be thinking of ForeignPtr, which does implement Ord)
12:05:33 × comonad quits (~comonad@p200300d02722ae00dce4ce9451b59974.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
12:10:54 Googulator25 joins (~Googulato@team.broadbit.hu)
12:10:54 × Googulator23 quits (~Googulato@team.broadbit.hu) (Quit: Client closed)
12:17:59 <merijn> int-e: Almost surely
12:18:10 <merijn> int-e: Bad STM design can easily cause that
12:20:35 <merijn> tomsmeding: MVar doesn't have to ever lock and queue if you don't want to, though
12:25:13 <tomsmeding> merijn: what do you mean?
12:25:28 × hakutaku quits (~textual@chen.yukari.eu.org) (Quit: My MacBook has gone to sleep. ZZZzzz…)
12:26:02 <bwe> Axman6, mauke: that's exactly what I want to do, I know when I've got new data and only then want to update the IORef / MVar. -- So if I only want to swap something out, I'd be fine with an IORef?
12:26:18 xff0x joins (~xff0x@2405:6580:b080:900:3b58:3b23:6c7:a174)
12:26:37 <tomsmeding> bwe: if the type of atomicModifyIORef' (mind the ') is good enough for you, it's almost guaranteed to be the fastest option
12:26:38 <bwe> tomsmeding: how would we categorize MVar, TVar, STM, IORef into two out of three of: correct, fast, convenient?
12:27:31 <tomsmeding> bwe: it's more how you use them, although neither MVar nor TVar are particularly fast (STM is just the framework around TVar so not a separate thing)
12:27:49 <tomsmeding> IORefs are plenty convenient if all you need is atomicModifyIORef', but they are rather limited otherwise
12:28:28 <tomsmeding> TVar is convenient and correct across the board (programming with STM is great!), but depending on your application's behaviour it may not be very fast
12:31:20 <tomsmeding> (you can get correct + fast + convenient if you never need to communicate between threads! Read-only shared data works very well ;p)
12:31:31 <bwe> tomsmeding: I simply need to update a state from db. Effectively swapping the old data for the new data. I am not sure how can I tell right now whether the type of atomicModifyIORef' fits my use case, though.
12:31:53 <tomsmeding> bwe: it kind of sounds like atomicModifyIORef' is good enough; if it isn't, come back
12:36:14 DetourNe- joins (~DetourNet@user/DetourNetworkUK)
12:36:47 × DetourNetworkUK quits (~DetourNet@user/DetourNetworkUK) (Read error: Connection reset by peer)
12:38:11 <bwe> tomsmeding: ok, thanks.
12:38:31 DetourNe- is now known as DetourNetworkUK
12:39:25 × fp quits (~Thunderbi@2001:708:150:10::9d7e) (Ping timeout: 244 seconds)
12:39:37 × danz20169 quits (~danza@user/danza) (Quit: got to go)
12:42:00 fp joins (~Thunderbi@2001:708:150:10::9d7e)
12:47:25 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 264 seconds)
12:52:35 × CiaoSen quits (~Jura@2a02:8071:64e1:da0:5a47:caff:fe78:33db) (Ping timeout: 265 seconds)
12:53:51 <merijn> tomsmeding: readMVar is non blocking on full MVars
12:54:20 <merijn> bwe: tbh, "not very fast" here still means "pretty goddamn fast"
12:55:13 <tomsmeding> merijn: as I said: if you only ever need to read, yes, life is easy :p
12:55:25 <merijn> If your update frequencies is measures in "once every few seconds" (or less frequent) the performance difference between any of the solutions is essentially irrelevant
12:55:31 <tomsmeding> ^
12:55:43 <merijn> if it's sub-second then it *might* matter
12:56:24 <merijn> once you're planning to update every N milliseconds, that's when I'd consider thinking about performance implications
12:56:30 <tomsmeding> I recommended atomicModifyIORef' more because it does what it does well, and doesn't suggest it can do any more than it does :p
13:00:41 × img quits (~img@user/img) (Quit: ZNC 1.10.1 - https://znc.in)
13:01:55 img joins (~img@user/img)
13:07:35 karenw joins (~karenw@user/karenw)
13:10:39 Googulator63 joins (~Googulato@team.broadbit.hu)
13:14:17 × Googulator25 quits (~Googulato@team.broadbit.hu) (Ping timeout: 272 seconds)
13:19:04 × bggd_ quits (~bgg@2a01:e0a:fd5:f510:5241:8daa:4da4:a780) (Ping timeout: 260 seconds)
13:21:31 <haskellbridge> <Zemyla> So you need a newtype to fold over both lists. @let newtype Z a b = Z { runZ :: a -> (Z a b -> b) -> b } @let zipF :: [a] -> [b] -> [(a, b)]; zipF xs ys = foldr (\a ak bk -> runZ bk a ak) (const []) xs $ foldr (\b bk -> Z $ \a ak -> (a, b):ak bk) (Z $ _ _ -> []) ys
13:21:46 <haskellbridge> <Zemyla> I used newlines, and it still didn't work. D:
13:27:05 × trickard quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
13:27:19 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
13:28:54 qqq joins (~qqq@185.54.21.105)
13:30:57 Zemy_ joins (~Zemy@2600:100c:b0a7:500d:4426:a6ff:feb6:d198)
13:30:57 × Zemy quits (~Zemy@72.178.108.235) (Read error: Connection reset by peer)
13:31:54 Zemy joins (~Zemy@72.178.108.235)
13:35:36 × Zemy_ quits (~Zemy@2600:100c:b0a7:500d:4426:a6ff:feb6:d198) (Ping timeout: 265 seconds)
13:37:46 <haskellbridge> <geekosaur> .
13:37:46 <haskellbridge> @botsnack
13:38:11 <haskellbridge> <geekosaur> got the newline, inserted a space as well ☹️
13:38:14 × wennefer0 quits (~wennefer0@user/wennefer0) (Read error: Connection reset by peer)
13:38:49 <geekosaur> also you used too many lines, it would have been pastebinned
13:38:57 <geekosaur> (if the newlines had gone through)
13:40:48 × trickard_ quits (~trickard@cpe-93-98-47-163.wireline.com.au) (Read error: Connection reset by peer)
13:41:01 trickard_ joins (~trickard@cpe-93-98-47-163.wireline.com.au)
13:41:44 × machinedgod quits (~machinedg@d75-159-126-101.abhsia.telus.net) (Ping timeout: 240 seconds)
13:44:08 comonad joins (~comonad@p200300d02722ae00dce4ce9451b59974.dip0.t-ipconnect.de)
13:51:20 <haskellbridge> <Zemyla> But what this does is fold the lists into a pair of coroutines which interleave.
13:56:04 Zemy_ joins (~Zemy@2600:100c:b0a7:500d:6465:32ff:febf:6476)
13:58:18 × Zemy quits (~Zemy@72.178.108.235) (Ping timeout: 252 seconds)
14:02:25 × fp quits (~Thunderbi@2001:708:150:10::9d7e) (Ping timeout: 245 seconds)
14:03:11 hakutaku joins (~textual@chen.yukari.eu.org)
14:04:22 fp joins (~Thunderbi@2001:708:20:1406::1370)
14:09:24 Zemy joins (~Zemy@mobile-107-80-206-40.mycingular.net)
14:12:09 × Zemy_ quits (~Zemy@2600:100c:b0a7:500d:6465:32ff:febf:6476) (Ping timeout: 260 seconds)
14:12:25 Zemy_ joins (~Zemy@mobile-107-80-206-40.mycingular.net)
14:15:57 × Zemy quits (~Zemy@mobile-107-80-206-40.mycingular.net) (Ping timeout: 250 seconds)
14:18:27 Zemy joins (~Zemy@mobile-107-80-206-40.mycingular.net)
14:21:09 × Zemy_ quits (~Zemy@mobile-107-80-206-40.mycingular.net) (Ping timeout: 250 seconds)
14:22:29 Zemy_ joins (~Zemy@mobile-107-80-206-40.mycingular.net)
14:22:37 Core6390 joins (~Zemy@2600:100c:b0a7:500d:444d:5bff:fe79:c99d)
14:23:17 Core8830 joins (~Zemy@12.50.228.210)
14:25:03 × Zemy quits (~Zemy@mobile-107-80-206-40.mycingular.net) (Ping timeout: 250 seconds)
14:26:09 × ZLima12 quits (~zlima12@user/meow/ZLima12) (Ping timeout: 260 seconds)
14:26:49 × Core6390 quits (~Zemy@2600:100c:b0a7:500d:444d:5bff:fe79:c99d) (Ping timeout: 246 seconds)
14:26:49 × Zemy_ quits (~Zemy@mobile-107-80-206-40.mycingular.net) (Ping timeout: 246 seconds)
14:28:48 ZLima12 joins (~zlima12@user/meow/ZLima12)
14:32:13 × Core8830 quits (~Zemy@12.50.228.210) (Read error: Connection reset by peer)
14:32:23 Zemy joins (~Zemy@2600:100c:b0a7:500d:9c2b:5aff:fe6b:6dd6)
14:32:52 Zemy_ joins (~Zemy@syn-192-198-252-043.biz.spectrum.com)
14:34:51 × Zemy quits (~Zemy@2600:100c:b0a7:500d:9c2b:5aff:fe6b:6dd6) (Read error: Connection reset by peer)
14:35:02 Zemy joins (~Zemy@2600:100c:b0a7:500d:9051:50ff:fef4:1dd3)
14:36:35 × Zemy_ quits (~Zemy@syn-192-198-252-043.biz.spectrum.com) (Read error: Connection reset by peer)
14:37:01 Zemy_ joins (~Zemy@syn-192-198-252-043.biz.spectrum.com)
14:39:33 × Zemy quits (~Zemy@2600:100c:b0a7:500d:9051:50ff:fef4:1dd3) (Ping timeout: 252 seconds)
14:40:16 × Zemy_ quits (~Zemy@syn-192-198-252-043.biz.spectrum.com) (Read error: Connection reset by peer)
14:40:22 Zemy joins (~Zemy@2600:100c:b0a7:500d:c49:b7ff:fe30:b590)
14:40:52 Zemy_ joins (~Zemy@12.50.228.210)
14:41:43 × karenw quits (~karenw@user/karenw) (Quit: Deep into that darkness peering...)
14:43:51 × Zemy quits (~Zemy@2600:100c:b0a7:500d:c49:b7ff:fe30:b590) (Read error: Connection reset by peer)
14:44:24 Zemy joins (~Zemy@2600:100c:b0a7:500d:e02b:53ff:fe18:58a7)
14:44:24 × Zemy_ quits (~Zemy@12.50.228.210) (Read error: Connection reset by peer)
14:44:43 × fp quits (~Thunderbi@2001:708:20:1406::1370) (Ping timeout: 264 seconds)
14:44:47 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
14:44:59 Zemy_ joins (~Zemy@12.50.228.210)
14:45:13 × nek0 quits (~nek0@user/nek0) (Quit: The Lounge - https://thelounge.chat)
14:46:19 Core7076 joins (~Zemy@mobile-107-80-206-16.mycingular.net)
14:48:54 × Zemy quits (~Zemy@2600:100c:b0a7:500d:e02b:53ff:fe18:58a7) (Ping timeout: 260 seconds)
14:49:33 × Zemy_ quits (~Zemy@12.50.228.210) (Ping timeout: 265 seconds)
14:51:05 nek0 joins (~nek0@user/nek0)
14:55:57 st_aldini joins (~Thunderbi@136.48.46.187)
14:56:25 Zemy joins (~Zemy@2600:100c:b0a7:500d:a4b2:14ff:fe15:3e1e)
14:56:39 machinedgod joins (~machinedg@d75-159-126-101.abhsia.telus.net)
14:57:47 danza joins (~danza@user/danza)
15:00:40 × Core7076 quits (~Zemy@mobile-107-80-206-16.mycingular.net) (Ping timeout: 265 seconds)
15:04:40 Zemy_ joins (~Zemy@72.178.108.235)
15:04:43 Sgeo joins (~Sgeo@user/sgeo)
15:04:56 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
15:05:40 gmg joins (~user@user/gehmehgeh)
15:08:09 × Zemy quits (~Zemy@2600:100c:b0a7:500d:a4b2:14ff:fe15:3e1e) (Ping timeout: 260 seconds)
15:17:29 Zemy joins (~Zemy@2600:100c:b0a7:500d:40a4:72ff:fef0:aeb0)
15:17:43 × Zemy_ quits (~Zemy@72.178.108.235) (Read error: Connection reset by peer)
15:18:08 Googulator63 is now known as Googulator
15:18:23 Zemy_ joins (~Zemy@72.178.108.235)
15:21:46 × Zemy quits (~Zemy@2600:100c:b0a7:500d:40a4:72ff:fef0:aeb0) (Ping timeout: 246 seconds)
15:25:15 × hakutaku quits (~textual@chen.yukari.eu.org) (Quit: My MacBook has gone to sleep. ZZZzzz…)
15:28:06 hakutaku joins (~textual@chen.yukari.eu.org)
15:35:27 danz33286 joins (~danza@user/danza)
15:35:58 absence joins (torgeihe@hildring.pvv.ntnu.no)
15:37:44 Zemy joins (~Zemy@2600:100c:b0a7:500d:1c6f:88ff:fed8:ebd3)
15:37:45 × Zemy_ quits (~Zemy@72.178.108.235) (Read error: Connection reset by peer)
15:37:54 × danza quits (~danza@user/danza) (Ping timeout: 260 seconds)
15:38:19 Zemy_ joins (~Zemy@72.178.108.235)
15:42:04 × Zemy quits (~Zemy@2600:100c:b0a7:500d:1c6f:88ff:fed8:ebd3) (Ping timeout: 246 seconds)
15:46:48 × sord937 quits (~sord937@gateway/tor-sasl/sord937) (Ping timeout: 252 seconds)
15:47:37 sord937 joins (~sord937@gateway/tor-sasl/sord937)
15:53:34 AndreiDuma joins (~AndreiDum@user/AndreiDuma)
15:54:37 AndreiDuma_ joins (~AndreiDum@user/AndreiDuma)
15:55:36 AndreiDuma_ parts (~AndreiDum@user/AndreiDuma) ()
15:56:28 AndreiDuma parts (~AndreiDum@user/AndreiDuma) ()
15:58:54 × weary-traveler quits (~user@user/user363627) (Remote host closed the connection)
15:59:56 <mauke> bwe: you might not even need the "modify" part. atomicWriteIORef is also an option, then
16:02:15 <mauke> for the "modify" version, you supply a function of type `a -> (a, b)` where the argument is the old value stored in the IORef, the first component of the result is the new value to be stored in the IORef, and the second component of the result is the value to return from the whole operation
16:03:59 <mauke> so if you can compute the new value without access to the old value, you can ignore the argument: atomicModifyIORef' myref (\_ -> (newvalue, ()))
16:04:33 <mauke> which is roughly equivalent to atomicWriteIORef myref newvalue (modulo strictness)
16:05:07 Digitteknohippie joins (~user@user/digit)
16:05:21 × Digit quits (~user@user/digit) (Ping timeout: 252 seconds)
16:20:02 × st_aldini quits (~Thunderbi@136.48.46.187) (Quit: st_aldini)
16:29:51 <chromoblob> Leary: i like your indentation, but code is hard to undersrand
16:31:15 × Googulator quits (~Googulato@team.broadbit.hu) (Ping timeout: 272 seconds)
16:32:43 × Zemy_ quits (~Zemy@72.178.108.235) (Remote host closed the connection)
16:32:57 Zemy joins (~Zemy@72.178.108.235)
16:33:45 <geekosaur> that's normal 🙂
16:39:08 × qqq quits (~qqq@185.54.21.105) (Quit: Lost terminal)
16:47:15 × ljdarj quits (~Thunderbi@user/ljdarj) (Quit: ljdarj)
16:47:36 ljdarj joins (~Thunderbi@user/ljdarj)
16:48:01 × merijn quits (~merijn@77.242.116.146) (Ping timeout: 264 seconds)
16:50:11 Psychotic1 joins (~Psychotic@2600:1007:b0a4:acff:921e:44c6:4ad9:edda)
16:54:35 × skum quits (~skum@user/skum) (Quit: WeeChat 4.8.1)
17:00:08 × hakutaku quits (~textual@chen.yukari.eu.org) (Quit: My MacBook has gone to sleep. ZZZzzz…)
17:00:25 merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl)
17:01:35 Zemy_ joins (~Zemy@2600:100c:b0a7:500d:ace7:8eff:fe84:f696)
17:03:57 × Zemy quits (~Zemy@72.178.108.235) (Ping timeout: 244 seconds)
17:04:12 × sord937 quits (~sord937@gateway/tor-sasl/sord937) (Quit: sord937)
17:07:00 Digitteknohippie is now known as Digit
17:07:50 Zemy joins (~Zemy@mobile-107-80-206-40.mycingular.net)
17:09:06 comerijn joins (~merijn@77.242.116.146)
17:09:34 × merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Read error: Connection reset by peer)
17:09:55 × Zemy_ quits (~Zemy@2600:100c:b0a7:500d:ace7:8eff:fe84:f696) (Ping timeout: 246 seconds)
17:10:10 <gentauro> oskarw: how did the interview go?
17:10:12 <gentauro> :)
17:17:00 Zemy_ joins (~Zemy@2600:100c:b0a7:500d:2c0a:a9ff:fe19:34cb)
17:17:06 hakutaku joins (~textual@chen.yukari.eu.org)
17:17:58 jmcantrell_ joins (~weechat@user/jmcantrell)
17:20:25 × Zemy quits (~Zemy@mobile-107-80-206-40.mycingular.net) (Ping timeout: 246 seconds)
17:20:46 × comerijn quits (~merijn@77.242.116.146) (Ping timeout: 246 seconds)
17:21:44 × hakutaku quits (~textual@chen.yukari.eu.org) (Ping timeout: 260 seconds)
17:30:01 Zemy joins (~Zemy@mobile-107-80-206-24.mycingular.net)
17:32:51 <oskarw> gentauro: Hi, unfortunately after getting my CV to HR today I get email that they will not proceed with my application and I didn't have interview
17:32:53 <oskarw> :(
17:33:23 <oskarw> I will have more time with finishing SICP I guess
17:33:24 × Zemy_ quits (~Zemy@2600:100c:b0a7:500d:2c0a:a9ff:fe19:34cb) (Ping timeout: 260 seconds)
17:34:16 × Zemy quits (~Zemy@mobile-107-80-206-24.mycingular.net) (Read error: Connection reset by peer)
17:34:28 Zemy joins (~Zemy@2600:100c:b0a7:500d:1407:a3ff:fee3:4a48)
17:34:31 trickard_ is now known as trickard
17:35:00 Zemy_ joins (~Zemy@mobile-107-80-206-24.mycingular.net)
17:35:11 hakutaku joins (~textual@chen.yukari.eu.org)
17:35:52 × Zemy quits (~Zemy@2600:100c:b0a7:500d:1407:a3ff:fee3:4a48) (Read error: Connection reset by peer)
17:36:01 Zemy joins (~Zemy@2600:100c:b0a7:500d:387b:fdff:feb0:4a62)
17:38:55 × Zemy_ quits (~Zemy@mobile-107-80-206-24.mycingular.net) (Ping timeout: 240 seconds)
17:39:37 × hakutaku quits (~textual@chen.yukari.eu.org) (Ping timeout: 250 seconds)
17:48:53 × Lycurgus quits (~juan@user/Lycurgus) (Quit: alsoknownas.renjuan.org ( juan@acm.org ))
17:53:06 housemate joins (~housemate@202.7.248.67)
17:53:51 hakutaku joins (~textual@chen.yukari.eu.org)
17:53:52 Square2 joins (~Square@user/square)
17:54:42 tzh joins (~tzh@c-76-115-131-146.hsd1.or.comcast.net)
18:04:54 <bwe> mauke: that way I could actually union the delta from the new entries of the new state of the db with the old.
18:06:07 <bwe> tomsmeding, mauke: is there some minimum working example with IORef (and forkIO) that you can recommend?
18:06:34 <bwe> Axman6, mauke: is any code of your examples you mentioned online by any chance?
18:07:52 wennefer0 joins (~wennefer0@user/wennefer0)
18:14:53 humasect joins (~humasect@dyn-192-249-132-90.nexicom.net)
18:16:52 Zemy_ joins (~Zemy@mobile-107-80-206-24.mycingular.net)
18:17:46 Core9513 joins (~Zemy@mobile-107-80-206-24.mycingular.net)
18:19:52 Core1640 joins (~Zemy@mobile-107-80-206-24.mycingular.net)
18:20:16 × Zemy quits (~Zemy@2600:100c:b0a7:500d:387b:fdff:feb0:4a62) (Ping timeout: 246 seconds)
18:20:55 Zemy joins (~Zemy@2600:100c:b0a7:500d:1cb1:d0ff:fe86:a54c)
18:21:14 × Zemy_ quits (~Zemy@mobile-107-80-206-24.mycingular.net) (Ping timeout: 260 seconds)
18:21:18 × Core9513 quits (~Zemy@mobile-107-80-206-24.mycingular.net) (Read error: Connection reset by peer)
18:21:29 Zemy_ joins (~Zemy@mobile-107-80-206-24.mycingular.net)
18:22:42 × Zemy quits (~Zemy@2600:100c:b0a7:500d:1cb1:d0ff:fe86:a54c) (Read error: Connection reset by peer)
18:22:50 Zemy joins (~Zemy@2600:100c:b0a7:500d:1855:c9ff:fec3:4df3)
18:23:00 × hakutaku quits (~textual@chen.yukari.eu.org) (Ping timeout: 244 seconds)
18:24:09 × Core1640 quits (~Zemy@mobile-107-80-206-24.mycingular.net) (Ping timeout: 260 seconds)
18:25:54 × Zemy_ quits (~Zemy@mobile-107-80-206-24.mycingular.net) (Ping timeout: 260 seconds)
18:27:40 <dolio> Does anyone here use the inspection-testing library?
18:28:23 × divlamir quits (~divlamir@user/divlamir) (Read error: Connection reset by peer)
18:28:43 divlamir joins (~divlamir@user/divlamir)
18:30:40 qqq joins (~qqq@185.54.21.105)
18:36:41 hakutaku joins (~textual@chen.yukari.eu.org)
18:41:10 × hakutaku quits (~textual@chen.yukari.eu.org) (Ping timeout: 245 seconds)
18:45:55 hakutaku joins (~textual@chen.yukari.eu.org)
18:48:18 × housemate quits (~housemate@202.7.248.67) (Quit: https://ineedsomeacidtocalmmedown.space/)
18:48:52 Zemy_ joins (~Zemy@mobile-107-80-206-40.mycingular.net)
18:49:39 × wennefer0 quits (~wennefer0@user/wennefer0) (Read error: Connection reset by peer)
18:50:43 × hakutaku quits (~textual@chen.yukari.eu.org) (Ping timeout: 264 seconds)
18:50:50 housemate joins (~housemate@202.7.248.67)
18:50:59 × Zemy quits (~Zemy@2600:100c:b0a7:500d:1855:c9ff:fec3:4df3) (Ping timeout: 260 seconds)
18:53:59 fp joins (~Thunderbi@2001-14ba-6e24-3000--198.rev.dnainternet.fi)
18:55:30 × chele quits (~chele@user/chele) (Remote host closed the connection)
19:04:20 hakutaku joins (~textual@chen.yukari.eu.org)
19:06:21 <mauke> bwe: https://paste.tomsmeding.com/7nIkll4c
19:08:53 × hakutaku quits (~textual@chen.yukari.eu.org) (Ping timeout: 250 seconds)
19:10:32 vanishingideal joins (~vanishing@user/vanishingideal)
19:11:46 Tuplanolla joins (~Tuplanoll@85-156-32-207.elisa-laajakaista.fi)
19:14:24 hakutaku joins (~textual@chen.yukari.eu.org)
19:17:39 Zemy joins (~Zemy@2600:100c:b0a7:500d:945c:5ff:fe60:ddeb)
19:20:07 × Zemy_ quits (~Zemy@mobile-107-80-206-40.mycingular.net) (Ping timeout: 264 seconds)
19:22:09 Zemy_ joins (~Zemy@72.178.108.235)
19:24:36 × Zemy quits (~Zemy@2600:100c:b0a7:500d:945c:5ff:fe60:ddeb) (Ping timeout: 256 seconds)
19:30:05 <gentauro> oskarw: sad to hear :(
19:34:51 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
19:35:07 danza joins (~danza@user/danza)
19:37:22 × danz33286 quits (~danza@user/danza) (Read error: Connection reset by peer)
19:38:22 oskarw` joins (~user@176.106.33.171)
19:39:48 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
19:40:13 × oskarw quits (~user@user/oskarw) (Read error: Connection reset by peer)
19:40:49 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 264 seconds)
19:42:33 Lord_of_Life_ is now known as Lord_of_Life
19:42:54 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 260 seconds)
19:47:44 × qqq quits (~qqq@185.54.21.105) (Quit: Lost terminal)
19:56:14 target_i joins (~target_i@user/target-i/x-6023099)
20:01:08 <bwe> mauke: Perfect! Thanks.
20:15:36 × hakutaku quits (~textual@chen.yukari.eu.org) (Ping timeout: 256 seconds)
20:16:43 × ringo_ quits (~ringo@157.230.117.128) (Ping timeout: 260 seconds)
20:21:33 ringo_ joins (~ringo@157.230.117.128)
20:22:09 hakutaku joins (~textual@chen.yukari.eu.org)
20:22:52 × Square2 quits (~Square@user/square) (Ping timeout: 244 seconds)
20:36:35 Lycurgus joins (~juan@user/Lycurgus)
20:36:38 × humasect quits (~humasect@dyn-192-249-132-90.nexicom.net) (Remote host closed the connection)
20:38:44 pavonia joins (~user@user/siracusa)
20:39:55 × fp quits (~Thunderbi@2001-14ba-6e24-3000--198.rev.dnainternet.fi) (Ping timeout: 246 seconds)
20:44:35 humasect joins (~humasect@dyn-192-249-132-90.nexicom.net)
20:45:50 × humasect quits (~humasect@dyn-192-249-132-90.nexicom.net) (Remote host closed the connection)
20:47:35 fp joins (~Thunderbi@2001-14ba-6e24-3000--198.rev.dnainternet.fi)
20:47:47 humasect joins (~humasect@dyn-192-249-132-90.nexicom.net)
20:55:09 <oskarw`> gentauro: I just hope other haskeller get this job
20:55:50 <davean> What job is this?
20:55:52 <gentauro> oskarw`: hopefully
20:56:05 <gentauro> it was Standard Charterd right?
20:56:07 <oskarw`> Yes
20:56:42 <oskarw`> https://jobs.standardchartered.com/job/Quantitative-Developer(Poland%2C-India)/43718-en_GB/?&feedid=363857
20:56:44 <gentauro> we can only hope they don't do a Jane Street, which is "silently" moving from OCaml to Python :'(
20:56:56 <oskarw`> Why I have ` in nickname?
20:57:17 <gentauro> oskarw`: is your `backup` nickname
20:57:34 oskarw` parts (~user@176.106.33.171) (ERC 5.6.1 (IRC client for GNU Emacs 30.2))
20:57:41 oskarw` joins (~user@176.106.33.171)
20:57:52 <oskarw`> Why do I have backup nickname?
20:58:01 <gentauro> you should just re-login again to libera with your real nickname
20:58:07 <oskarw`> Ok
20:58:21 × oskarw` quits (~user@176.106.33.171) (Remote host closed the connection)
20:58:28 oskarw joins (~user@user/oskarw)
20:58:38 <oskarw> Here I am
20:59:01 <gentauro> oskarw: nice, no more tick ;)
20:59:14 <oskarw> Yes ^^
20:59:31 karenw joins (~karenw@user/karenw)
21:01:36 <oskarw> What is general consensus about lisp in this channel?
21:02:04 <oskarw> Personally, I prefer lisp syntax to haskell, but I also love haskell typing
21:03:58 <gentauro> oskarw: I would say, way to many parenthesis. However, I'm an `emacs` user since 2005 ish, so, I'm kind of used to it
21:06:12 <oskarw> gentauro: I have also been using Emacs, but only for 2 years.
21:06:19 skum joins (~skum@user/skum)
21:06:53 × machinedgod quits (~machinedg@d75-159-126-101.abhsia.telus.net) (Ping timeout: 260 seconds)
21:07:08 <oskarw> I stared using emacs because I had course about agda, and agda manual recommended Emacs.
21:11:11 × danza quits (~danza@user/danza) (Read error: Connection reset by peer)
21:13:43 vanishingideal joins (~vanishing@user/vanishingideal)
21:15:07 peterbecich joins (~Thunderbi@71.84.33.135)
21:15:50 × Lycurgus quits (~juan@user/Lycurgus) (Quit: alsoknownas.renjuan.org ( juan@acm.org ))
21:25:12 <monochrom> I prefer both Haskell syntax and types.
21:26:24 × michalz quits (~michalz@185.246.207.203) (Remote host closed the connection)
21:28:41 × target_i quits (~target_i@user/target-i/x-6023099) (Quit: leaving)
21:28:52 <EvanR> a consensus about lisp sounds ominous AF
21:28:54 <monochrom> Someone wrote a "Liskell" for Lisp syntax but Haskell semantics. :)
21:29:08 haritz joins (~hrtz@140.228.70.141)
21:29:08 × haritz quits (~hrtz@140.228.70.141) (Changing host)
21:29:08 haritz joins (~hrtz@user/haritz)
21:31:29 <EvanR> I'm fascinated by the one or two APLs implemented in haskell
21:31:52 <EvanR> because of how much it can be decomplected
21:32:14 <EvanR> (not that they ended up optimized in any way)
21:36:19 jmcantrell_ is now known as jmcantrell
21:41:57 <haskellbridge> <sm> did you see that APL video I linked EvanR ?
21:42:12 <EvanR> I'm not sure
21:43:59 × humasect quits (~humasect@dyn-192-249-132-90.nexicom.net) (Remote host closed the connection)
21:46:03 <haskellbridge> <sm> ah, it was in the matrix Haskell room. "random: this talk on APL teaching and style (https://youtu.be/9xCJ3BCIudI) was really interesting. Contrasts (and similarities) with Haskell came up a few times."
21:54:54 acidjnk joins (~acidjnk@p200300d6e71719732cd814db2eedd90f.dip0.t-ipconnect.de)
21:55:13 × takuan quits (~takuan@d8D86B9E9.access.telenet.be) (Ping timeout: 264 seconds)
22:01:35 <gentauro> oh Dialog, Swedish company that was purchased by SimCorp iirc
22:01:54 <gentauro> I guess now SimCorp "owns" APL
22:01:55 <gentauro> :(
22:12:12 Googulator joins (~Googulato@2a01-036d-0106-030a-3891-da7f-f3f3-f997.pool6.digikabel.hu)
22:14:49 × Psychotic1 quits (~Psychotic@2600:1007:b0a4:acff:921e:44c6:4ad9:edda) (Quit: Leaving)
22:15:14 Psychotic1 joins (~Psychotic@2600:1007:b0a4:acff:921e:44c6:4ad9:edda)
22:16:09 × oskarw quits (~user@user/oskarw) (Remote host closed the connection)
22:25:21 × Psychotic1 quits (~Psychotic@2600:1007:b0a4:acff:921e:44c6:4ad9:edda) (Remote host closed the connection)
22:40:01 <haskellbridge> <Liamzee> is it better or worse than for is a function in Haskell, vs being a macro in Lisp or syntax in a traditional language?
22:40:38 <geekosaur> does it have to be one or the other?
22:40:48 × vanishingideal quits (~vanishing@user/vanishingideal) (Ping timeout: 252 seconds)
22:41:15 Gravifer joins (~Gravifer@user/Gravifer)
22:41:26 <haskellbridge> <Liamzee> well, i was wondering if for/for_ being functions in Haskell were advantages, HOF zoo has the issue that you'd actually need to know what the HOFs used are
22:41:38 <geekosaur> Haskell's laziness lets you define some things that must be built-in control structures in other languages as functions. But the same can be said of Tcl and Ruby, in their own ways
22:42:03 × Gravifer quits (~Gravifer@user/Gravifer) (Client Quit)
22:42:15 <haskellbridge> <Liamzee> i mean any language with strong macros can define custom control structures
22:42:15 × peterbecich quits (~Thunderbi@71.84.33.135) (Ping timeout: 265 seconds)
22:42:23 Gravifer joins (~Gravifer@user/Gravifer)
22:42:31 <haskellbridge> <Liamzee> well, runtime macros
22:43:09 <geekosaur> what I was getting at is that I consider them just different mechanisms. each may have advantages in some situations and disadvantages in others
22:43:55 <monochrom> Haskell does not have a good macro story, so lazy function is usually better in Haskell. (Try implementing "for" as a TH macro, then try using it.)
22:44:29 <monochrom> Conversely, Lisp doesn't have a good laziness story, so macro is better!
22:45:02 <monochrom> And like geekosaur said, there is also a symmetric difference.
22:46:24 <haskellbridge> <Liamzee> i guess macros vs functions is more of a smaller difference, macros tend to be untyped, functions tend to be typed
22:46:35 <monochrom> What I don't like about Lisp/Scheme macros is that if you write so much as "(f x)" then I have no idea what's its evaluation order because I can't remember whether f is a function or a macro.
22:46:38 <haskellbridge> <Liamzee> the real question is whether hof zoo is a key advantage
22:47:04 <monochrom> (Sure, I can look up the docs. Now add the empirical fact that programmers don't write docs.)
22:47:30 <geekosaur> functions aren't typed in scheme, amnd as monochrom says, there's no way to tell just from looking at code using it whether it's even a function
22:47:51 <haskellbridge> <Liamzee> i love my traverse abuse, turning control flow into data is fun
22:47:54 vanishingideal joins (~vanishing@user/vanishingideal)
22:48:19 <geekosaur> and macros can be typed (see typed TH, granting that TH is not very usable as macro systems go)
22:49:43 <haskellbridge> <Liamzee> but i guess the real point is that there's no real advantage to let (@) = (,) in traverse (uncurry when) [ cond @ action...]
22:54:05 × fp quits (~Thunderbi@2001-14ba-6e24-3000--198.rev.dnainternet.fi) (Ping timeout: 245 seconds)
23:00:41 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
23:05:49 × Gravifer quits (~Gravifer@user/Gravifer) (Ping timeout: 272 seconds)
23:08:14 fp joins (~Thunderbi@89-27-10-140.bb.dnainternet.fi)
23:10:34 Googulator63 joins (~Googulato@2a01-036d-0106-030a-3891-da7f-f3f3-f997.pool6.digikabel.hu)
23:10:34 × Googulator quits (~Googulato@2a01-036d-0106-030a-3891-da7f-f3f3-f997.pool6.digikabel.hu) (Quit: Client closed)
23:14:28 × mrmonday quits (~robert@what.i.hope.is.not.a.tabernaevagant.es) (Quit: .)
23:15:59 mrmonday joins (~robert@what.i.hope.is.not.a.tabernaevagant.es)
23:30:59 tydes joins (~tydes@user/ttydes)
23:31:39 × timide_ quits (~timide@user/timide) (Quit: WeeChat 4.7.2)
23:31:43 × fp quits (~Thunderbi@89-27-10-140.bb.dnainternet.fi) (Ping timeout: 240 seconds)
23:42:55 Inline joins (~User@2001-4dd7-bc56-0-9df6-8597-3530-1076.ipv6dyn.netcologne.de)
23:51:21 Zemy joins (~Zemy@72.178.108.235)
23:51:21 × Zemy_ quits (~Zemy@72.178.108.235) (Read error: Connection reset by peer)
23:57:11 machinedgod joins (~machinedg@d75-159-126-101.abhsia.telus.net)

All times are in UTC on 2026-01-23.