2026/05/23

2026-05-23 00:00:49 +0000vetkat(~vetkat@user/vetkat) (Quit: So long, and thanks for all the fish)
2026-05-23 00:01:51 +0000vetkat(~vetkat@user/vetkat) vetkat
2026-05-23 00:03:26 +0000merijn(~merijn@62.45.136.136) merijn
2026-05-23 00:08:33 +0000merijn(~merijn@62.45.136.136) (Ping timeout: 250 seconds)
2026-05-23 00:19:13 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 00:23:40 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-05-23 00:33:29 +0000DetourNe-(~DetourNet@user/DetourNetworkUK) DetourNetworkUK
2026-05-23 00:33:43 +0000DetourNetworkUK(~DetourNet@user/DetourNetworkUK) (Read error: Connection reset by peer)
2026-05-23 00:34:51 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 00:35:43 +0000DetourNe-DetourNetworkUK
2026-05-23 00:40:09 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 272 seconds)
2026-05-23 00:41:43 +0000peterbecich(~Thunderbi@71.84.33.135) peterbecich
2026-05-23 00:45:06 +0000myxos(~myxos@67-1-178-42.tcso.qwest.net) (Ping timeout: 248 seconds)
2026-05-23 00:50:21 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 00:55:28 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 01:05:32 +0000peterbecich(~Thunderbi@71.84.33.135) (Ping timeout: 240 seconds)
2026-05-23 01:06:08 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 01:06:17 +0000myxos(~myxos@67-1-178-42.tcso.qwest.net) myxokephale
2026-05-23 01:08:36 +0000troojg(~troojg@user/troojg) troojg
2026-05-23 01:10:32 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
2026-05-23 01:16:53 +0000foul_owl(~kerry@94.156.149.96) (Ping timeout: 272 seconds)
2026-05-23 01:17:47 +0000ncf(~ncf@monade.li) (Remote host closed the connection)
2026-05-23 01:21:32 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 01:27:03 +0000ncf(~ncf@monade.li) ncf
2026-05-23 01:28:09 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2026-05-23 01:39:36 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 01:44:46 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 01:52:24 +0000acidjnk_new3(~acidjnk@p200300d6e700e508282254f1e55c94a7.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
2026-05-23 01:53:00 +0000ncf(~ncf@monade.li) (Remote host closed the connection)
2026-05-23 01:54:13 +0000ncf(~ncf@monade.li) ncf
2026-05-23 01:55:23 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 02:00:17 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-05-23 02:11:09 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 02:12:57 +0000tremon(~tremon@83.80.159.219) tremon
2026-05-23 02:16:09 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-05-23 02:26:57 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 02:27:35 +0000puke(~puke@014136001187.ctinets.com) (*.net *.split)
2026-05-23 02:27:58 +0000puke(~puke@014136001187.ctinets.com)
2026-05-23 02:32:16 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 251 seconds)
2026-05-23 02:35:15 +0000ricardomaps(~ricardoma@2804:14d:a040:81ea:a057:893f:21d0:8f42)
2026-05-23 02:36:39 +0000Eoco(~ian@128.101.131.218) Eoco
2026-05-23 02:38:02 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 02:42:55 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 02:48:34 +0000xff0x(~xff0x@ai070051.d.east.v6connect.net) (Ping timeout: 265 seconds)
2026-05-23 02:51:19 +0000Inline(~noOne@ipservice-092-208-182-236.092.208.pools.vodafone-ip.de) (Ping timeout: 264 seconds)
2026-05-23 02:53:36 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 02:54:20 +0000rainbyte(~rainbyte@181.47.219.3) (Quit: rainbyte)
2026-05-23 02:55:15 +0000ricardomaps(~ricardoma@2804:14d:a040:81ea:a057:893f:21d0:8f42) (Quit: ricardomaps)
2026-05-23 02:55:37 +0000xff0x(~xff0x@2405:6580:b080:900:31a:40c3:3c58:e32)
2026-05-23 02:58:03 +0000rainbyte(~rainbyte@181.47.219.3) rainbyte
2026-05-23 02:58:48 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 263 seconds)
2026-05-23 03:02:21 +0000emilym(~Thunderbi@user/emilym) emilym
2026-05-23 03:04:14 +0000fgarcia(~lei@user/fgarcia) fgarcia
2026-05-23 03:06:34 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 245 seconds)
2026-05-23 03:09:22 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 03:10:06 +0000myxos(~myxos@67-1-178-42.tcso.qwest.net) (Ping timeout: 256 seconds)
2026-05-23 03:16:31 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 03:19:37 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 252 seconds)
2026-05-23 03:24:42 +0000m(~travltux@user/travltux) (Quit: WeeChat 4.7.2)
2026-05-23 03:27:08 +0000m(~travltux@user/travltux) travltux
2026-05-23 03:27:32 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 03:32:15 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-05-23 03:51:43 +0000myxos(~myxos@67-1-178-42.tcso.qwest.net) myxokephale
2026-05-23 04:03:25 +0000machinedgod(~machinedg@d172-219-48-230.abhsia.telus.net) (Remote host closed the connection)
2026-05-23 04:04:34 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) humasect
2026-05-23 04:04:45 +0000machinedgod(~machinedg@172.219.48.230) machinedgod
2026-05-23 04:04:51 +0000machinedgod(~machinedg@172.219.48.230) (Client Quit)
2026-05-23 04:06:33 +0000troojg(~troojg@user/troojg) (Ping timeout: 248 seconds)
2026-05-23 04:15:22 +0000spew(~spew@user/spew) (Quit: nyaa~)
2026-05-23 04:25:32 +0000Jacqueline__(uid751191@id-751191.helmsley.irccloud.com)
2026-05-23 04:38:53 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 04:43:47 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-05-23 04:54:37 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 04:59:43 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 05:02:43 +0000takuan(~takuan@d8D86B9E9.access.telenet.be)
2026-05-23 05:10:26 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 05:15:30 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 05:24:56 +0000euphores(~SASL_euph@user/euphores) (Quit: Leaving.)
2026-05-23 05:26:13 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 05:29:25 +0000dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 276 seconds)
2026-05-23 05:31:12 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
2026-05-23 05:38:54 +0000euphores(~SASL_euph@user/euphores) euphores
2026-05-23 05:38:59 +0000dibblego(~dibblego@116.255.1.119)
2026-05-23 05:38:59 +0000dibblego(~dibblego@116.255.1.119) (Changing host)
2026-05-23 05:38:59 +0000dibblego(~dibblego@haskell/developer/dibblego) dibblego
2026-05-23 05:39:54 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 05:43:48 +0000dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 253 seconds)
2026-05-23 05:44:54 +0000tnt1(~Thunderbi@user/tnt1) tnt1
2026-05-23 05:46:49 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2026-05-23 05:47:40 +0000dibblego(~dibblego@116.255.1.119)
2026-05-23 05:47:40 +0000dibblego(~dibblego@116.255.1.119) (Changing host)
2026-05-23 05:47:40 +0000dibblego(~dibblego@haskell/developer/dibblego) dibblego
2026-05-23 05:49:04 +0000tnt1(~Thunderbi@user/tnt1) (Ping timeout: 245 seconds)
2026-05-23 05:51:35 +0000tnt1(~Thunderbi@user/tnt1) tnt1
2026-05-23 05:53:25 +0000haritz(~hrtz@user/haritz) (Quit: ZNC 1.8.2+deb3.1+deb12u1 - https://znc.in)
2026-05-23 05:57:57 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 06:03:19 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 06:13:24 +0000dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 263 seconds)
2026-05-23 06:13:45 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 06:15:20 +0000dibblego(~dibblego@116-255-1-119.ip4.superloop.au)
2026-05-23 06:15:21 +0000dibblego(~dibblego@116-255-1-119.ip4.superloop.au) (Changing host)
2026-05-23 06:15:21 +0000dibblego(~dibblego@haskell/developer/dibblego) dibblego
2026-05-23 06:18:09 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-05-23 06:29:07 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 06:34:11 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 272 seconds)
2026-05-23 06:40:53 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 06:44:36 +0000metabulation(~wootehfoo@user/wootehfoot) (Quit: Leaving)
2026-05-23 06:45:18 +0000Jacqueline__(uid751191@id-751191.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
2026-05-23 06:46:00 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 253 seconds)
2026-05-23 06:55:07 +0000ss4(~wootehfoo@user/wootehfoot) wootehfoot
2026-05-23 06:56:43 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 07:01:27 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-05-23 07:12:29 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 07:12:58 +0000Inline(~noOne@ipservice-092-208-182-236.092.208.pools.vodafone-ip.de) Inline
2026-05-23 07:17:17 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 253 seconds)
2026-05-23 07:20:07 +0000tnt1(~Thunderbi@user/tnt1) (Ping timeout: 264 seconds)
2026-05-23 07:22:56 +0000Googulator(~Googulato@84-236-52-41.pool.digikabel.hu) (Quit: Client closed)
2026-05-23 07:23:09 +0000Googulator(~Googulato@84-236-52-41.pool.digikabel.hu)
2026-05-23 07:27:44 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) (Quit: Leaving...)
2026-05-23 07:28:22 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 07:30:08 +0000poscat0x04(~poscat@user/poscat) (Remote host closed the connection)
2026-05-23 07:33:04 +0000poscat(~poscat@user/poscat) poscat
2026-05-23 07:35:14 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2026-05-23 07:40:22 +0000enoq(~enoq@2a05:1141:1fd:3b00:5934:e936:8f0a:3520) enoq
2026-05-23 07:41:57 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 07:42:08 +0000 <enoq> been looking at kotlin conf talks and came across a value semantics talk; basically instead of lenses or deeply nested copies, the compiler takes care of that and is faster than writing mutating code by hand
2026-05-23 07:42:15 +0000tnt1(~Thunderbi@user/tnt1) tnt1
2026-05-23 07:42:35 +0000 <enoq> applied optimizations include flattening pointers
2026-05-23 07:43:03 +0000 <enoq> made me think: what if lenses were actually built into the compiler
2026-05-23 07:47:00 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-05-23 07:56:55 +0000tusko(~uwu@user/tusko) (Quit: Lost terminal)
2026-05-23 07:57:44 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 07:58:34 +0000tnt1(~Thunderbi@user/tnt1) (Quit: tnt1)
2026-05-23 07:59:27 +0000tnt1(~Thunderbi@user/tnt1) tnt1
2026-05-23 08:02:44 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 08:07:11 +0000ss4wootehfoot
2026-05-23 08:14:15 +0000xff0x(~xff0x@2405:6580:b080:900:31a:40c3:3c58:e32) (Ping timeout: 272 seconds)
2026-05-23 08:14:31 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 08:14:51 +0000xff0x(~xff0x@2405:6580:b080:900:dc8c:f72a:135a:db02)
2026-05-23 08:19:25 +0000tusko(~uwu@user/tusko) tusko
2026-05-23 08:19:31 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 08:21:57 +0000enoq(~enoq@2a05:1141:1fd:3b00:5934:e936:8f0a:3520) (Remote host closed the connection)
2026-05-23 08:29:54 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 08:34:47 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-05-23 08:42:57 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 08:44:41 +0000divlamir(~divlamir@user/divlamir) (Read error: Connection reset by peer)
2026-05-23 08:47:54 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-05-23 08:55:29 +0000Googulator(~Googulato@84-236-52-41.pool.digikabel.hu) (Quit: Client closed)
2026-05-23 08:55:44 +0000Googulator(~Googulato@84-236-52-41.pool.digikabel.hu)
2026-05-23 08:55:45 +0000divlamir(~divlamir@user/divlamir) divlamir
2026-05-23 08:58:03 +0000acidjnk_new3(~acidjnk@p200300d6e700e5081bf32954ce73307a.dip0.t-ipconnect.de)
2026-05-23 08:58:44 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 09:00:33 +0000acidjnk_new(~acidjnk@p200300d6e700e570753f3d38cea48d7a.dip0.t-ipconnect.de)
2026-05-23 09:00:44 +0000tzh(~tzh@c-76-115-131-146.hsd1.or.comcast.net) (Quit: zzz)
2026-05-23 09:02:56 +0000emilym(~Thunderbi@user/emilym) emilym
2026-05-23 09:03:14 +0000acidjnk_new3(~acidjnk@p200300d6e700e5081bf32954ce73307a.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
2026-05-23 09:04:36 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 09:04:52 +0000jle`(~jle`@2603:8001:3b00:11::1fae) (Quit: WeeChat 4.8.1)
2026-05-23 09:06:59 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 245 seconds)
2026-05-23 09:08:21 +0000jle`(~jle`@23.240.67.73) jle`
2026-05-23 09:26:05 +0000marinelli(~weechat@gateway/tor-sasl/marinelli) (Quit: marinelli)
2026-05-23 09:39:29 +0000marinelli(~weechat@gateway/tor-sasl/marinelli) marinelli
2026-05-23 09:42:28 +0000target_i(~target_i@user/target-i/x-6023099) target_i
2026-05-23 09:43:58 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 09:44:11 +0000karenw(~karenw@user/karenw) karenw
2026-05-23 09:48:39 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-05-23 09:55:31 +0000 <Rembane> Are the performance properties inherent to the lenses or could it also work to make the building blocks the lenses are made of that are already parts of the compiler have those optimizations?
2026-05-23 09:56:47 +0000 <jaror> I don't think it is specific to lenses. It is just in general in Haskell if you only update a small part of a large datastructure you still have to pay for reallocating the "spine"
2026-05-23 09:58:40 +0000 <jaror> Value semantics avoids this by giving each function a fresh copy of the whole value, so each function gets ownership of all its arguments and can freely mutate them.
2026-05-23 09:59:46 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 10:00:05 +0000 <jaror> This copying has generally been considered too expensive in FP languages. Languages like Koka and Roc did experiment with a form of opportunistic mutation through reference counting.
2026-05-23 10:01:43 +0000DetourNetworkUK(~DetourNet@user/DetourNetworkUK) (Read error: Software caused connection abort)
2026-05-23 10:02:30 +0000DetourNetworkUK(~DetourNet@user/DetourNetworkUK) DetourNetworkUK
2026-05-23 10:04:24 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-05-23 10:04:52 +0000 <Rembane> Got it, this all seems very reasonable.
2026-05-23 10:05:21 +0000 <Rembane> It would be interesting to do some work on opportunistic mutation in Haskell.
2026-05-23 10:07:04 +0000 <Rembane> And since it is an intersting idea people have already done some work on it: https://www.microsoft.com/en-us/research/wp-content/uploads/2023/05/fbip.pdf
2026-05-23 10:09:51 +0000 <jaror> Yeah that seems like a promising approach
2026-05-23 10:15:33 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 10:22:33 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 248 seconds)
2026-05-23 10:23:13 +0000 <jaror> I think laziness does make it quite a bit harder though
2026-05-23 10:26:07 +0000 <jaror> Also quite a restriction:
2026-05-23 10:26:08 +0000 <jaror> We enforce this in our calculus by only
2026-05-23 10:26:08 +0000 <jaror> allowing top-level functions (rather than arbitrary closures) as arguments in our fully in-place
2026-05-23 10:26:08 +0000 <jaror> calculus, effectively making it second-order.
2026-05-23 10:27:34 +0000karenw(~karenw@user/karenw) (Quit: Deep into that darkness peering...)
2026-05-23 10:32:57 +0000puke(~puke@014136001187.ctinets.com) (*.net *.split)
2026-05-23 10:33:21 +0000puke(~puke@014136001187.ctinets.com)
2026-05-23 10:33:37 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 10:38:51 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 10:44:59 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 10:50:04 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 270 seconds)
2026-05-23 10:50:08 +0000 <[exa]> jaror: does the vector-simple have any portability implications/improvements?
2026-05-23 10:50:27 +0000 <jaror> I'm not sure what portability problems there are with vector
2026-05-23 10:51:04 +0000 <jaror> vector-simple does use GHC's primops extensively
2026-05-23 10:51:04 +0000 <[exa]> I mean, not directly (you depend on GHC :D ) but would it be easier to implement the necessary compiler tooling for this in a hypothetical new compiler or so?
2026-05-23 10:51:59 +0000 <jaror> Yes I think it would be easier to adapt to other compilers
2026-05-23 10:52:07 +0000 <[exa]> anyway the package looks Ok to me, I'd recommend switching to completely 3rd-person narrative in the readme ("theirs" and "ours" vs "vector" and "vector-simple")
2026-05-23 10:52:36 +0000 <jaror> vector relies a lot of GHC's optimizations in addition to just the primops they use
2026-05-23 10:52:55 +0000 <jaror> s/a lot of/a lot on/
2026-05-23 10:53:49 +0000 <[exa]> also would be great if you could provide exact numbers on overhead (there's like 2+n words estimate written down now, would be great to have exact numbers in hand together with what actual `vector` overhead looks like)
2026-05-23 10:54:19 +0000 <jaror> 2+n should be exact
2026-05-23 10:54:36 +0000 <[exa]> "much faster to build from scratch" -- you mean rewrite by hand, or build with ghc?
2026-05-23 10:55:11 +0000 <[exa]> (btw apologies for a bit of reviewer mood here ^ :D it's good, there's just always so many tiny things to clarify)
2026-05-23 10:55:13 +0000 <jaror> build with ghc, perhaps "compile if not cached" is a better description
2026-05-23 10:55:35 +0000 <jaror> Yeah, I appreciate the feedback
2026-05-23 10:55:37 +0000 <[exa]> ah yes then write "compile" and perhaps point to lack of dependencies
2026-05-23 10:56:39 +0000 <[exa]> btw as far as I get it the main use-case for users is for programs that have lots of tiny vectors, right? I'd throw that into the main description.
2026-05-23 10:58:26 +0000 <jaror> I don't think that's specifically the main use case. I think this will be my go-to package for anything but the case where I need large mutable arrays.
2026-05-23 10:59:07 +0000 <[exa]> Rembane: re "performance properties of lenses" -- I somehow got the feeling that prolens exploited stuff inherent to compilers in a weird way ( (->) is a profunctor that is used there instead of Identity, thus it saves a level of wrapery over the plain (->) that ghc is very good at handling of). Thought it might be relevant to have a look there.
2026-05-23 10:59:09 +0000 <jaror> I now often use lists where I think I really should use vectors/arrays instead, but there is no lightweight simple array/vector package.
2026-05-23 10:59:45 +0000Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2026-05-23 10:59:45 +0000 <int-e> Vector has, let me think, a tag, two indices, a length, a size, n indices, ceil(n/1024) extra words (assuming 8 byte words)
2026-05-23 11:00:31 +0000 <jaror> a length and a size?
2026-05-23 11:00:48 +0000 <[exa]> afaik as with reserve() from C
2026-05-23 11:00:56 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 11:01:11 +0000 <int-e> wait, it's worse, isn't it? (Mutable)Array# can't be unpacked, so there's a pointer and another tag?
2026-05-23 11:01:43 +0000 <jaror> It's just:
2026-05-23 11:01:43 +0000 <jaror> data Vector a = Vector {-# UNPACK #-} !Int
2026-05-23 11:01:43 +0000 <jaror> {-# UNPACK #-} !Int
2026-05-23 11:01:43 +0000 <jaror> {-# UNPACK #-} !(Array a)
2026-05-23 11:02:16 +0000 <[exa]> that's the simple vector or the vector vector?
2026-05-23 11:02:34 +0000 <jaror> So two ints for the slicing and an unpacked `Array` which is just the length and the total size for the card table (indeed) and then n + ceil(n/1024)
2026-05-23 11:02:40 +0000 <jaror> that's the normal vector
2026-05-23 11:02:44 +0000 <int-e> Array is data Array a = Array { array#: Array# a } and Array# a has that size and length and elements and a card table
2026-05-23 11:03:03 +0000 <jaror> Oh, won't that be unpacked twice?
2026-05-23 11:03:38 +0000 <jaror> Yeah, I guess
2026-05-23 11:03:47 +0000 <int-e> No, for that it would have to be unpacked into the Array type. And that wouldn't work with the GC which treats Array# (= a frozen mutable array) specially.
2026-05-23 11:04:14 +0000 <jaror> You can unpack Array#, I believe
2026-05-23 11:04:24 +0000 <jaror> GHC is not warning me about it at least
2026-05-23 11:05:08 +0000 <int-e> That just means it doesn't explicitly hate the pragma. I don't think it *can* actually unpack it.
2026-05-23 11:05:17 +0000 <jaror> Oh annoying
2026-05-23 11:05:34 +0000 <jaror> I saw this old note and thought something must have happened by now: https://gitlab.haskell.org/ghc/ghc/-/wikis/unpacking-arrays
2026-05-23 11:05:43 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 11:08:53 +0000 <jaror> I'm also now realizing that perhaps vector is not the best name since it seems to be more associated with dynamically resizable or at least slice-able arrays
2026-05-23 11:13:37 +0000Square(~Square@user/square) Square
2026-05-23 11:16:33 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 11:17:52 +0000weary-traveler(~user@user/user363627) user363627
2026-05-23 11:21:52 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 11:24:55 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-05-23 11:28:56 +0000 <[exa]> jaror: chunk!
2026-05-23 11:29:19 +0000 <[exa]> the lack of chunky packages is disturbing
2026-05-23 11:30:49 +0000__monty__(~toonn@user/toonn) toonn
2026-05-23 11:31:39 +0000 <jaror> Chunk sounds like it should be part of a larger structure.
2026-05-23 11:31:44 +0000 <int-e> jaror: I guess the right way to check this is to look at the CMM for `data Array = Array !(Array# Int)` and the same with {-# UNPACK #-} added and see that in both cases, the constructors heap representation is the same (one tag, one pointer).
2026-05-23 11:32:21 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 11:32:37 +0000 <int-e> The reason why I was quite sure though is that support for this would have to manifest in the GC, but all the array traversal is tied to the tags for MutableArray#/Array#.
2026-05-23 11:33:28 +0000 <jaror> Yeah, I now also found https://gitlab.haskell.org/ghc/ghc/-/issues/24802 which is about ByteArray# but that's still open too
2026-05-23 11:33:48 +0000 <jaror> I am convinced
2026-05-23 11:36:44 +0000 <int-e> It's interesting that it doesn't warn about using UNPACK on strict unlifted fields, even though it has no effect for those: data X = X {-# UNPACK #-} !Int#
2026-05-23 11:37:07 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2026-05-23 11:37:38 +0000 <jaror> I think it can have effect on unlifted fields, but of course not on unboxed fields indeed.
2026-05-23 11:37:56 +0000 <jaror> with UnliftedDatatypes I mean
2026-05-23 11:38:02 +0000 <jaror> those should be unpackable
2026-05-23 11:38:39 +0000 <jaror> I think I actually opened an issue that it did warn that I didn't have a ! on an unlifted field
2026-05-23 11:39:06 +0000 <jaror> https://gitlab.haskell.org/ghc/ghc/-/issues/20204
2026-05-23 11:40:49 +0000 <int-e> It's funny that there's no mention of garbage collection in #24802
2026-05-23 11:44:24 +0000bitdex(~bitdex@gateway/tor-sasl/bitdex) bitdex
2026-05-23 11:44:52 +0000 <int-e> I guess the narrow case of data Array a = Array (Array# a) could be handled by not introducing a new tag for the constructor. That wouldn't help you if you want to later unpack `Array` into some other constructor.
2026-05-23 11:45:47 +0000 <jaror> With data-elevator, I think you can do newtype Array a = Array (Lazy (Array# a))
2026-05-23 11:46:02 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 11:46:30 +0000 <jaror> And Lazy is also a newtype
2026-05-23 11:47:57 +0000 <int-e> Anyway, just to state this point in isolation: Right now, every variable-sized heap object (really just the various arrays, plus some RTS internal things (captured stack frames, I guess?)) has its own special case in the garbage collection functions. To unpack those into other constructors that would have to be generalized.
2026-05-23 11:48:22 +0000 <jaror> Yes, that makes sense
2026-05-23 11:53:08 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds)
2026-05-23 12:03:51 +0000emilym(~Thunderbi@user/emilym) emilym
2026-05-23 12:04:02 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 12:08:39 +0000weary-traveler(~user@user/user363627) (Quit: Konversation terminated!)
2026-05-23 12:08:57 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 250 seconds)
2026-05-23 12:19:53 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 12:24:31 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-05-23 12:24:42 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 265 seconds)
2026-05-23 12:26:58 +0000tnt1(~Thunderbi@user/tnt1) (Quit: tnt1)
2026-05-23 12:27:38 +0000tnt1(~Thunderbi@user/tnt1) tnt1
2026-05-23 12:27:50 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Excess Flood)
2026-05-23 12:29:36 +0000tnt1(~Thunderbi@user/tnt1) (Client Quit)
2026-05-23 12:30:05 +0000tnt1(~Thunderbi@user/tnt1) tnt1
2026-05-23 12:31:55 +0000tnt1(~Thunderbi@user/tnt1) (Client Quit)
2026-05-23 12:33:25 +0000Lord_of_Life(~Lord@user/lord-of-life/x-2819915) Lord_of_Life
2026-05-23 12:33:26 +0000Digitteknohippie(~user@user/digit) Digit
2026-05-23 12:33:55 +0000Digit(~user@user/digit) (Ping timeout: 272 seconds)
2026-05-23 12:34:46 +0000emilym(~Thunderbi@user/emilym) (Remote host closed the connection)
2026-05-23 12:35:03 +0000emilym(~Thunderbi@user/emilym) emilym
2026-05-23 12:37:41 +0000 <jaror> Maybe I can just define it as data Vector a = V0 | V1 !a | V2 !a !a | Vn (Array# a), then it is always at smaller or equal in size to lists
2026-05-23 12:37:45 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 12:42:52 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 268 seconds)
2026-05-23 12:47:28 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 12:49:18 +0000DigitteknohippieDigit
2026-05-23 12:52:31 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 13:02:47 +0000merijn(~merijn@62.45.136.136) merijn
2026-05-23 13:06:20 +0000haritz(~hrtz@2a01:4b00:bc2e:7000:d5af:a266:ca31:5ef8)
2026-05-23 13:06:21 +0000haritz(~hrtz@2a01:4b00:bc2e:7000:d5af:a266:ca31:5ef8) (Changing host)
2026-05-23 13:06:21 +0000haritz(~hrtz@user/haritz) haritz
2026-05-23 13:06:50 +0000karenw(~karenw@user/karenw) karenw
2026-05-23 13:08:00 +0000merijn(~merijn@62.45.136.136) (Ping timeout: 252 seconds)
2026-05-23 13:08:43 +0000humasect(~humasect@dyn-192-249-132-90.nexicom.net) humasect
2026-05-23 13:18:36 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 13:21:00 +0000emilym(~Thunderbi@user/emilym) (Ping timeout: 245 seconds)
2026-05-23 13:23:24 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 252 seconds)
2026-05-23 13:34:11 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 13:40:44 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 245 seconds)
2026-05-23 13:42:13 +0000nattkyrro(~serenity@user/nattkyrro) nattkyrro
2026-05-23 13:48:00 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 13:53:07 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds)
2026-05-23 13:58:50 +0000cyclemaniac(~cyclemani@2a02:8071:881:2d20:c1c7:793e:b89b:1589)
2026-05-23 14:03:48 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) merijn
2026-05-23 14:06:21 +0000synchromesh(~john@2406:5a00:247e:1500:29d7:765d:2d71:9db7) (Read error: Connection reset by peer)
2026-05-23 14:06:57 +0000synchromesh(~john@2406:5a00:247e:1500:bc22:e610:8777:fdc1) synchromesh
2026-05-23 14:08:45 +0000merijn(~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 247 seconds)