Home liberachat/#haskell: Logs Calendar

Logs on 2023-07-07 (liberachat/#haskell)

00:01:00 <ski> .. i'm not sure how common it is to anticipate that, by naming the type `t' (and then going on to pass that module directly to a functor), rather than construct a custom wrapper ("adapter") module when instantiating the functor
00:01:13 <ski> anyway, the (above) thought just occured to me
00:01:42 × xff0x_ quits (~xff0x@2405:6580:b080:900:50da:9b7c:4bac:847a) (Ping timeout: 246 seconds)
00:03:51 xff0x_ joins (~xff0x@ai086045.d.east.v6connect.net)
00:04:28 inversed joins (~inversed@bcdcac82.skybroadband.com)
00:05:14 × califax quits (~califax@user/califx) (Remote host closed the connection)
00:06:38 bontaq joins (~user@ool-45779b84.dyn.optonline.net)
00:06:43 sagax joins (~sagax_nb@user/sagax)
00:09:34 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
00:13:39 califax joins (~califax@user/califx)
00:14:34 falafel joins (~falafel@2603-7000-a700-8710-eb2d-b2d5-726c-ab42.res6.spectrum.com)
00:25:48 × ddellacosta quits (~ddellacos@146.70.166.152) (Ping timeout: 240 seconds)
00:26:26 × connrs quits (~connrs@user/connrs) (Read error: Connection reset by peer)
00:27:31 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
00:27:55 ddellacosta joins (~ddellacos@146.70.168.100)
00:29:05 connrs joins (~connrs@user/connrs)
00:31:48 EvanR_ joins (~EvanR@user/evanr)
00:32:04 notzmv joins (~zmv@user/notzmv)
00:32:16 × EvanR quits (~EvanR@user/evanr) (Read error: Connection reset by peer)
00:33:28 × waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 240 seconds)
00:35:02 × caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline)
00:39:37 EvanR_ is now known as EvanR
00:40:41 × lainon quits (~textual@c-98-54-78-2.hsd1.al.comcast.net) (Quit: My Mac has gone to sleep. ZZZzzz…)
00:40:52 thegeekinside joins (~thegeekin@189.217.90.138)
00:41:05 dmgk joins (~dmgk@user/dmgk)
00:42:33 <EvanR> the extension LexicalNegation seems to mess with the lexer
00:42:51 <EvanR> everything I know is wrong now
00:43:14 <Axman6> Welcome to the future
00:44:12 Inst_ joins (~Inst@2601:6c4:4081:2fc0:1933:a56d:b98f:3d34)
00:48:02 × Inst__ quits (~Inst@2601:6c4:4081:2fc0:44fe:e619:5fe8:5723) (Ping timeout: 246 seconds)
00:51:41 × thegeekinside quits (~thegeekin@189.217.90.138) (Ping timeout: 245 seconds)
00:55:03 <jackdk> record dot syntax will also change the lexing of what would otherwise be an operator followed by an identifier
00:57:41 <geekosaur> even ExplicitForAll changes the lexer
00:59:57 priesvitne_sklo joins (~priesvitn@109-230-60-22.dynamic.orange.sk)
01:01:54 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds)
01:02:31 × inversed quits (~inversed@bcdcac82.skybroadband.com) (Ping timeout: 245 seconds)
01:03:10 delYsid` parts (~user@84-115-138-74.cable.dynamic.surfer.at) (ERC 5.6-git (IRC client for GNU Emacs 30.0.50))
01:08:21 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 245 seconds)
01:08:28 <Axman6> What even is a token??? Nobody knows
01:10:32 × albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
01:10:37 <Axman6> So WAI has Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived, there isn't much sodumentation about what you should do with the response function, but it feels to me like it really should be treated as a linear argument, it should only be called once. is that something that can be done with current linear types?
01:11:41 <Axman6> Request -> (Response -> IO ResponseReceived) %1 -> IO ResponseReceived?
01:14:27 × Tuplanolla quits (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Quit: Leaving.)
01:16:40 albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8)
01:18:11 <EvanR> are you sure, because there's more things in heaven and middleware than are dreamt of in your philosophy
01:19:18 <Axman6> I think it should always be the case that the response handler is only called once, even when middleware is involved, as it can wrap the passed in handler in a new function which itself is only called once
01:20:12 <jackdk> I think under this model you have `type Middleware = Application %1 -> Application`, so you consume the old respond function and provide a new one.
01:20:47 <Axman6> yeah that feels right
01:22:03 bilegeek joins (~bilegeek@2600:1008:b092:dfba:4ead:a88d:cd60:d095)
01:25:08 <EvanR> are you required to use the response function
01:26:12 <EvanR> or is it more of a continuation
01:26:24 × priesvitne_sklo quits (~priesvitn@109-230-60-22.dynamic.orange.sk) (Ping timeout: 246 seconds)
01:33:24 × bontaq quits (~user@ool-45779b84.dyn.optonline.net) (Ping timeout: 246 seconds)
01:35:43 <Axman6> it's the only way to create a ResponseReceived, so yes
01:41:29 <jackdk> I believe it was done to avoid a rank-2 type, and the constructor is hard to find (not impossible, but you shouldn't go using it if you're writing an application)
01:54:03 × xff0x_ quits (~xff0x@ai086045.d.east.v6connect.net) (Ping timeout: 246 seconds)
02:00:44 × phma quits (phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce) (Read error: Connection reset by peer)
02:01:07 phma joins (phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce)
02:08:40 eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
02:10:21 × jargon quits (~jargon@184.101.73.95) (Remote host closed the connection)
02:12:57 × eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 246 seconds)
02:14:38 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
02:14:38 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
02:14:39 finn_elija is now known as FinnElija
02:16:34 nate2 joins (~nate@c-98-45-169-16.hsd1.ca.comcast.net)
02:17:59 × td_ quits (~td@i53870936.versanet.de) (Ping timeout: 246 seconds)
02:19:34 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec)
02:19:52 td_ joins (~td@i5387091B.versanet.de)
02:28:35 trev joins (~trev@user/trev)
02:29:33 × phma quits (phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce) (Read error: Connection reset by peer)
02:30:05 phma joins (~phma@host-67-44-208-87.hnremote.net)
02:42:48 xff0x_ joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
02:42:57 × terrorjack quits (~terrorjac@2a01:4f8:c17:87f8::) (Quit: The Lounge - https://thelounge.chat)
02:46:22 terrorjack joins (~terrorjac@2a01:4f8:c17:87f8::)
02:52:01 <talismanick> How difficult is it to learn/use Shake if you use Cabal and not Stack?
02:52:57 <talismanick> (I prefer Cabal because it's less restrictive wrt one-off libraries that don't fit neatly into Stackage releases)
02:53:16 justsomeguy joins (~justsomeg@user/justsomeguy)
02:58:02 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
03:02:13 <jackdk> As easy as any other hackage package. I have a few internal work projects built upon shake.
03:03:10 × mei quits (~mei@user/mei) (Remote host closed the connection)
03:03:21 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 245 seconds)
03:05:36 mei joins (~mei@user/mei)
03:07:14 × fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity)
03:11:01 <EvanR> in the docs for Data.Scientific I find this warning
03:11:18 <EvanR> WARNING: 'coefficient' and 'base10exponent' violate substantivity of 'Eq'.
03:11:40 <EvanR> that was close, now what does substantivity mean
03:12:55 <EvanR> oh, there's an example demonstrating the phenomenon
03:16:29 <EvanR> they observe a difference in two scientifics that might report equal according to ==
03:18:53 × nate2 quits (~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 246 seconds)
03:24:38 <sm> talismanick: I think there's no real connection.. unless you are making your shake file a cabal or stack script ?
03:25:31 <sm> and that doesn't affect Shake's learnability
03:30:35 <Axman6> EvanR: is that because it doesn't make an effort to find the minimal mantissa?
03:31:47 <EvanR> something about the internal representation will be normalized when pretty printed or by toDecimalDigits
03:32:11 <EvanR> otherwise mantissa might have trailing zeros
03:35:33 <Axman6> so 123*10^-3 === 12300*10^-5? (pretty sure those are bout 1.23?)
03:35:37 <Axman6> both*
03:36:05 <EvanR> they look equal to me
03:36:30 <Axman6> but it doesn't normalise the latter into the former right?
03:36:55 <EvanR> according to the docs if you're messing with the internal representation, no
03:37:19 <EvanR> not after every operation like Rational
03:48:48 aniketd[m] parts (~aniketdma@2001:470:69fc:105::dede) ()
03:49:11 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 245 seconds)
03:49:58 aniketd[m] joins (~aniketdma@2001:470:69fc:105::dede)
03:50:04 jargon joins (~jargon@184.101.73.95)
03:53:41 × aforemny_ quits (~aforemny@2001:9e8:6ce6:ca00:3bad:e307:8f54:4c53) (Ping timeout: 246 seconds)
03:54:02 aforemny joins (~aforemny@i59F516EE.versanet.de)
04:05:53 <Axman6> man, python's coroutines make me feel very unconfortable, they feel so hacky
04:12:32 × son0p quits (~ff@181.136.122.143) (Ping timeout: 250 seconds)
04:12:51 × robertm quits (robertm@lattice.rojoma.com) (Quit: WeeChat 3.8)
04:14:42 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
04:15:11 robertm joins (robertm@lattice.rojoma.com)
04:16:48 oo_miguel joins (~Thunderbi@78-11-179-96.static.ip.netia.com.pl)
04:32:17 × Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
04:34:28 × hololeap quits (~quassel@user/hololeap) (Quit: Bye)
04:36:47 hololeap joins (~quassel@user/hololeap)
04:48:59 × jargon quits (~jargon@184.101.73.95) (Remote host closed the connection)
04:53:33 misterfish joins (~misterfis@84-53-85-146.bbserv.nl)
04:59:37 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
05:07:44 jargon joins (~jargon@184.101.73.95)
05:07:54 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
05:08:21 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
05:09:00 azimut_ joins (~azimut@gateway/tor-sasl/azimut)
05:09:20 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
05:09:28 michalz joins (~michalz@185.246.207.203)
05:10:39 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds)
05:14:06 <probie> Axman6: The "new" ones using await (e.g. asyncio), or the old ones sending values to generators (as described in PEP-342)?
05:16:35 <maerwald[m]> https://discourse.haskell.org/t/rfc-bumping-recommended-ghc-to-9-4-5-in-ghcup/6866
05:16:55 × Buggys quits (Buggys@shelltalk.net) (Ping timeout: 246 seconds)
05:21:31 × stilgart quits (~Christoph@chezlefab.net) (Quit: leaving)
05:21:42 stilgart joins (~Christoph@chezlefab.net)
05:26:04 Buggys joins (Buggys@Buggy.shelltalk.net)
05:27:03 harveypwca joins (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67)
05:29:46 praknak joins (~praknak@bcdcac82.skybroadband.com)
05:33:51 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds)
05:40:14 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection)
05:43:02 Guest5320 joins (~finn@176-151-21-224.abo.bbox.fr)
06:04:32 × bilegeek quits (~bilegeek@2600:1008:b092:dfba:4ead:a88d:cd60:d095) (Quit: Leaving)
06:08:06 genieliu joins (~jianshili@36.112.90.53)
06:13:51 coot joins (~coot@89-69-206-216.dynamic.chello.pl)
06:17:15 × Guest5320 quits (~finn@176-151-21-224.abo.bbox.fr) (Ping timeout: 246 seconds)
06:18:18 × misterfish quits (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 246 seconds)
06:22:02 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:22:22 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 260 seconds)
06:23:50 × hugo quits (znc@verdigris.lysator.liu.se) (Ping timeout: 250 seconds)
06:24:07 son0p joins (~ff@181.136.122.143)
06:29:59 × son0p quits (~ff@181.136.122.143) (Ping timeout: 246 seconds)
06:30:11 Guest5320 joins (~finn@176-151-21-224.abo.bbox.fr)
06:37:17 fendor joins (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0)
06:45:48 hugo joins (znc@verdigris.lysator.liu.se)
06:47:54 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
06:57:15 gurkenglas joins (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de)
06:59:02 × falafel quits (~falafel@2603-7000-a700-8710-eb2d-b2d5-726c-ab42.res6.spectrum.com) (Ping timeout: 246 seconds)
07:00:18 alternateved joins (~user@77-254-166-50.dynamic.inetia.pl)
07:02:45 fweht joins (uid404746@id-404746.lymington.irccloud.com)
07:05:23 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
07:14:50 × genieliu quits (~jianshili@36.112.90.53) (Quit: Lost terminal)
07:17:16 gmg joins (~user@user/gehmehgeh)
07:18:33 mbuf joins (~Shakthi@49.207.178.186)
07:21:47 × actioninja6 quits (~actioninj@user/actioninja) (Ping timeout: 246 seconds)
07:23:31 titibandit joins (~titibandi@user/titibandit)
07:24:55 × ft quits (~ft@p508db151.dip0.t-ipconnect.de) (Quit: leaving)
07:25:26 priesvitne_sklo joins (~priesvitn@109-230-60-22.dynamic.orange.sk)
07:25:36 actioninja6 joins (~actioninj@user/actioninja)
07:25:45 merijn joins (~merijn@86-86-29-250.fixed.kpn.net)
07:28:04 <Axman6> probie: I'm going to say both
07:34:36 × shriekingnoise quits (~shrieking@186.137.175.87) (Ping timeout: 245 seconds)
07:34:58 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
07:36:02 × harveypwca quits (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving)
07:36:55 × gurkenglas quits (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) (Read error: Connection reset by peer)
07:38:59 Pickchea joins (~private@user/pickchea)
07:42:33 hisa38779 joins (~hisa38@104-181-102-238.lightspeed.wepbfl.sbcglobal.net)
07:44:01 acidjnk joins (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de)
07:44:03 × hisa3877 quits (~hisa38@104-181-102-238.lightspeed.wepbfl.sbcglobal.net) (Ping timeout: 246 seconds)
07:44:03 hisa38779 is now known as hisa3877
07:45:50 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
07:48:43 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Remote host closed the connection)
07:50:08 misterfish joins (~misterfis@87.215.131.102)
07:52:54 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
08:09:32 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
08:16:49 × alternateved quits (~user@77-254-166-50.dynamic.inetia.pl) (Remote host closed the connection)
08:18:36 ubert joins (~Thunderbi@2a02:8109:abc0:6434:2722:db0d:9dca:9984)
08:20:00 alternateved joins (~user@77-254-166-50.dynamic.inetia.pl)
08:21:45 Sgeo_ joins (~Sgeo@user/sgeo)
08:21:52 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
08:25:12 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
08:25:25 danse-nr3_ joins (~francesco@151.57.190.75)
08:25:31 × econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
08:26:01 gmg joins (~user@user/gehmehgeh)
08:27:48 <dminuoso_> Axman6: I finally figured out whats wrong with python coroutines.
08:28:08 <dminuoso_> Python coroutines are in truth just an implementation detail of green threads.
08:30:07 × priesvitne_sklo quits (~priesvitn@109-230-60-22.dynamic.orange.sk) (Remote host closed the connection)
08:30:21 <dminuoso_> There's so many red herrings around asyncio. The core theme is to facilitate efficient green thread scheduling on things that wait on external resources.
08:31:10 <dminuoso_> I mean Haskell has all of python asyncio built-in to GHC RTS + STM
08:32:15 <dminuoso_> Well, and some of `async` library for some of the thread coordination stuff.
08:35:17 mmhat joins (~mmh@p200300f1c716433cee086bfffe095315.dip0.t-ipconnect.de)
08:39:21 × danse-nr3_ quits (~francesco@151.57.190.75) (Ping timeout: 246 seconds)
08:40:09 × tzh quits (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
08:43:07 × bliminse quits (~bliminse@user/bliminse) (Quit: leaving)
08:49:48 son0p joins (~ff@181.136.122.143)
08:52:40 danse-nr3_ joins (~francesco@151.57.190.75)
08:53:00 Tuplanolla joins (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi)
09:00:07 dminuoso_ is now known as dminuoso
09:00:28 × Sgeo_ quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
09:02:49 gurkenglas joins (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de)
09:09:35 × DustinStiles[m] quits (~duwstiles@2001:470:69fc:105::3:699b) (Remote host closed the connection)
09:11:10 jmdaemon joins (~jmdaemon@user/jmdaemon)
09:12:02 × polykernel[m] quits (~polykerne@user/polykernel) (Remote host closed the connection)
09:12:54 gtf joins (~gideon@2a02:8012:2259:0:299:560e:70f9:4290)
09:14:56 barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl)
09:18:07 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection)
09:26:56 Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915)
09:27:56 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 245 seconds)
09:28:16 Lord_of_Life_ is now known as Lord_of_Life
09:32:58 × azimut_ quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds)
09:41:22 gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
09:42:08 × fendor quits (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0) (Remote host closed the connection)
09:43:49 fendor joins (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0)
09:45:50 × jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds)
10:02:56 × xff0x_ quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 245 seconds)
10:04:39 waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
10:06:08 × tcard_ quits (~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Quit: Leaving)
10:07:47 tcard joins (~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303)
10:09:26 Pickchea joins (~private@user/pickchea)
10:10:07 × danse-nr3_ quits (~francesco@151.57.190.75) (Remote host closed the connection)
10:13:38 × barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed)
10:15:27 danse-nr3_ joins (~francesco@151.57.190.75)
10:15:57 barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl)
10:16:21 dsrt^ joins (~cd@24.125.210.85)
10:18:38 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec)
10:19:37 × driib quits (~driib@vmi931078.contaboserver.net) (Quit: The Lounge - https://thelounge.chat)
10:20:04 driib joins (~driib@vmi931078.contaboserver.net)
10:23:05 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Ping timeout: 246 seconds)
10:25:35 azr4e1 joins (~azr4e1@host86-134-72-140.range86-134.btcentralplus.com)
10:25:38 × azr4e1 quits (~azr4e1@host86-134-72-140.range86-134.btcentralplus.com) (Remote host closed the connection)
10:37:28 × barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed)
10:39:36 × merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 245 seconds)
10:42:26 Lewix joins (uid158496@id-158496.tinside.irccloud.com)
10:42:32 <Lewix> hi all
10:42:36 <Lewix> is free node still alive?
10:43:29 <Lewix> I need to learn Haskell pretty fast, any advice that point me to the right direction would be appreciated. I'm a huge fan of functional programming but have not used it for years.
10:44:56 <danse-nr3_> been writing haskell for years and still have not learned it
10:46:02 <tomsmeding> Lewix: https://www.haskell.org/documentation/ is not very opinionated but perhaps a good start
10:49:58 <Lewix> @danse-nr3_ that is very encouraging :)
10:49:58 <lambdabot> Unknown command, try @list
10:50:19 <Lewix> @tomsmeding thank you man
10:50:19 <lambdabot> Unknown command, try @list
10:50:33 <Lewix> danse-nr3_: that is very encouraging :)
10:50:39 <Lewix> tomsmeding: thank you man!
10:51:10 × fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity)
10:51:52 <danse-nr3_> apologies, was an indirect advice about setting expectations and the "need" requirement. The value-level language, focusing on pure code, is quite consistent and in my opinion one can get a long way by approaching it
10:52:32 <Lewix> tomsmeding: any video lecture that you enjoyed or would recommend?
10:52:38 <Lewix> danse-nr3_: noted. It's all good
10:57:15 <juri_> Lewix: it depends how you learn. i learn by doing, so more doing works. :)
10:57:27 tomsmeding is same as juri_
10:57:42 <tomsmeding> find something you like building, and try to do it well
10:58:13 <tomsmeding> depending on your level, some of the slides here are nice https://uu-afp.github.io/schedule.html
10:58:53 <Rembane> Lewix: Also, come back here and ask questions whenever you get stuck!
10:59:50 <probie> If I write something which uses backpack, and upload it to hackage, will things for users break beyond the haddock docs?
11:01:45 × gmg quits (~user@user/gehmehgeh) (Remote host closed the connection)
11:02:34 gmg joins (~user@user/gehmehgeh)
11:02:35 merijn joins (~merijn@097-099-045-062.dynamic.caiway.nl)
11:13:36 bontaq joins (~user@ool-45779b84.dyn.optonline.net)
11:14:32 <maerwald[m]> probie: stack users won't be able to use it
11:15:08 × hpc quits (~juzz@ip98-169-35-163.dc.dc.cox.net) (Ping timeout: 240 seconds)
11:17:19 hpc joins (~juzz@ip98-169-35-163.dc.dc.cox.net)
11:20:25 <dminuoso> And depending on how much backpack you use, it can greatly limit the people capable or willing to work on your library.
11:23:12 <probie> dminuoso: That doesn't bother me. If they're not interested in it, they're not interested in it. Any library I write is non-proselytising
11:26:20 <Lewix> Also any resources to prepare for interview with Haskell is more than welcome
11:26:23 × smalltalkman quits (uid545680@id-545680.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
11:26:28 <Lewix> Rembane: thank you
11:28:47 <probie> maerwald[m]: I thought stack uses cabal under the hood. Are there any issues if the libraries depended on are the implementation of backpack signatures?
11:30:37 slaydr joins (~slaydr@2601:1c2:980:4ea0::43b3)
11:33:09 hippoid joins (~hippoid@user/hippoid)
11:33:47 × ryantrinkle quits (~ryantrink@89.247.249.243) (Ping timeout: 246 seconds)
11:37:10 <merijn> probie: https://gist.github.com/merijn/8152d561fb8b011f9313c48d876ceb07
11:37:50 merijn increases the value of his "time saved on explaining the different meanings of cabal"-counter
11:39:36 × danse-nr3_ quits (~francesco@151.57.190.75) (Ping timeout: 245 seconds)
11:40:12 × hippoid quits (~hippoid@user/hippoid) (Quit: WeeChat 3.8)
11:40:57 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
11:42:28 × pandeyan quits (~pandeyan@135-180-53-134.fiber.dynamic.sonic.net) (Quit: ZNC 1.8.2 - https://znc.in)
11:45:25 <probie> That failed to answer my question, probably because I'm not particularly bright
11:46:12 <probie> but my current guess is that if there exists package X that's a dependency, whether X uses backpack or not is irrelevant to whether or not stack can install it
11:46:24 anpad joins (~pandeyan@user/anpad)
11:46:39 <Rembane> probie: I know way too little about Stack + backpack, but there's a very long thread about it here: https://github.com/commercialhaskell/stack/issues/2540
11:47:06 <probie> in which case "stack users won't be able to use it" seems wrong. It seems like all they won't be able to do is instantiate backpack sigs
11:50:19 danse-nr3_ joins (~francesco@151.57.190.75)
11:53:01 notzmv joins (~zmv@user/notzmv)
11:54:22 <dminuoso> probie: Oh its not necessarily about proselytising, but rather about maintenance and ownership.
11:54:42 <dminuoso> The more exotic the tools used to build the product, the less people will contribute or be able to pick it up later on.
11:54:53 <dminuoso> I know, in this channel this is a heretic thing to say.
11:55:41 <dminuoso> It's much more fun to compile to categories with dependent types, using highly undocumented cabal features..
11:56:40 dhil joins (~dhil@78.45.150.83.ewm.ftth.as8758.net)
11:57:22 <tomsmeding> and use TH in the process
12:09:05 barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl)
12:11:47 xff0x_ joins (~xff0x@ai086045.d.east.v6connect.net)
12:13:27 fweht joins (uid404746@id-404746.lymington.irccloud.com)
12:16:14 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
12:25:56 smalltalkman joins (uid545680@id-545680.hampstead.irccloud.com)
12:26:38 × danse-nr3_ quits (~francesco@151.57.190.75) (Read error: Connection reset by peer)
12:26:51 danse-nr3_ joins (~francesco@151.57.136.214)
12:40:04 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
12:46:17 × slaydr quits (~slaydr@2601:1c2:980:4ea0::43b3) (Read error: Connection reset by peer)
12:46:47 × Guest5320 quits (~finn@176-151-21-224.abo.bbox.fr) (Ping timeout: 264 seconds)
12:48:22 <jackdk> hasn't backpack been out for yonks though?
12:49:18 <merijn> jackdk: Yes
12:49:24 <merijn> probably close to a decade or longer
12:57:34 ft joins (~ft@p508db151.dip0.t-ipconnect.de)
12:59:39 pyooque joins (~puke@user/puke)
12:59:39 puke is now known as Guest8530
12:59:39 × Guest8530 quits (~puke@user/puke) (Killed (platinum.libera.chat (Nickname regained by services)))
12:59:39 pyooque is now known as puke
13:18:07 × gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.1)
13:24:08 Zambyte joins (~user@c-73-114-31-74.hsd1.ma.comcast.net)
13:24:36 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
13:24:36 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
13:24:36 wroathe joins (~wroathe@user/wroathe)
13:24:50 <Profpatsch> I want to replace a bunch of allocation bracket functions with a single ResourceT block
13:26:03 <Profpatsch> is ResourceT.allocate forkIO killThread a viable way to wrap a thread that has a sub-task which does not need cleanup itself?
13:36:55 comerijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
13:38:28 × kimiamania6 quits (~681cf57f@user/kimiamania) (Quit: PegeLinux)
13:39:09 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
13:39:51 kimiamania6 joins (~681cf57f@user/kimiamania)
13:39:56 × merijn quits (~merijn@097-099-045-062.dynamic.caiway.nl) (Ping timeout: 246 seconds)
13:40:15 <Profpatsch> Hm, seems to work
13:40:28 <Profpatsch> (it’s just for a dumb heartbeat log output)
13:47:58 × barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed)
13:55:16 <Inst_> bleh, going back to translating "Big Book of Small Python Projects" into Haskell
13:56:12 <Inst_> i'm trying to do a vigniere cipher, but via HOF instead of manual recursion
13:57:14 <Inst_> ehh, the probable solution is foldr
13:58:51 barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl)
14:00:05 <int-e> zipWith and cycle?
14:02:38 lainon joins (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39)
14:03:37 × lainon quits (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39) (Client Quit)
14:08:00 <tomsmeding> ^
14:14:49 × jinsl quits (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) (Quit: ZNC - https://znc.in)
14:17:06 × juri_ quits (~juri@84-19-175-187.pool.ovpn.com) (Ping timeout: 245 seconds)
14:18:01 <Profpatsch> Hm, is there any multiplication that can determine wraparound on Iont?
14:18:03 <Profpatsch> *Int?
14:18:13 <Profpatsch> Maybe a newtype that throws an exception?
14:19:19 jinsl joins (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea)
14:23:15 Midjak joins (~Midjak@82.66.147.146)
14:24:41 <c_wraith> I suppose you could do that, but detecting it in ways that aren't architecture-specific is an incredible slowdown.
14:26:00 <Profpatsch> I just had to double and checked whether the result is smaller, which should be pretty easy
14:26:05 <Profpatsch> It’s not a tight loop anyway
14:26:37 <Profpatsch> Kind of a weird excercise anyway dunno why I’m spending time on this lol
14:26:44 <Profpatsch> Mostly out of interest I guess
14:28:15 <c_wraith> the most general way to detect it is look for the sign of the output being wrong.
14:28:57 <c_wraith> add two positive numbers and get a negative? multiply a negative number by a positive number and get a positive?
14:28:59 juri_ joins (~juri@84-19-175-187.pool.ovpn.com)
14:29:03 thegeekinside joins (~thegeekin@189.217.90.138)
14:33:19 Arima_Kun joins (~Arima_Kun@45.124.5.97)
14:33:57 × waleee quits (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7) (Ping timeout: 245 seconds)
14:36:34 × misterfish quits (~misterfis@87.215.131.102) (Ping timeout: 260 seconds)
14:36:44 × Arima_Kun quits (~Arima_Kun@45.124.5.97) (Client Quit)
14:37:02 ripspin joins (~chatzilla@1.145.156.103)
14:41:52 <Inst_> int-e: i'm trying to skip non-alphanumerical characters
14:47:33 × juri_ quits (~juri@84-19-175-187.pool.ovpn.com) (Ping timeout: 246 seconds)
14:52:09 × jinsl quits (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) (Quit: ZNC - https://znc.in)
14:54:01 jinsl joins (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea)
14:57:57 × jinsl quits (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea) (Client Quit)
14:59:27 juri_ joins (~juri@84-19-175-187.pool.ovpn.com)
15:00:25 shriekingnoise joins (~shrieking@186.137.175.87)
15:02:20 <EvanR> perform the operation on an intermediate Integer and check the "actual result" for overflow xD
15:04:14 <EvanR> Inst_, span and break?
15:09:01 <janus> anybody at munihac? i landed a bit late, not sure where people are now
15:11:18 × barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed)
15:13:12 barcisz joins (~barcisz@79.191.32.38.ipv4.supernova.orange.pl)
15:17:12 tzh joins (~tzh@c-24-21-73-154.hsd1.wa.comcast.net)
15:21:29 × bontaq quits (~user@ool-45779b84.dyn.optonline.net) (Remote host closed the connection)
15:21:46 <Inst_> is there a better way to do it?
15:22:11 <Inst_> i mean, i'm pretty satisfied with using foldr on the cycled key
15:22:33 <EvanR> in a sense foldr can do anything
15:22:37 <Inst_> and using right fold as left fold
15:23:14 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec)
15:23:15 × acidjnk quits (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
15:23:20 × alternateved quits (~user@77-254-166-50.dynamic.inetia.pl) (Ping timeout: 250 seconds)
15:23:50 gnalzo joins (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
15:23:55 <Inst_> so you have an outside accumulator that's the actual text, and the cycled key as what's being folded over, with the lambda being keyed to process the accumulator
15:24:05 <Inst_> mildly annoyed that foldr1 doesn't work with this
15:25:32 <EvanR> if you're talking about accumulators then you probably (a form of) foldl
15:25:39 <EvanR> probably want*
15:25:52 <Inst_> iirc you can't use an outside accumulator...
15:26:03 <EvanR> what does that mean
15:26:26 <Inst_> well, i think you can do it that way
15:27:15 <Inst_> you know the foldr trick wherein you have (foldr fun (const foo) list1 list2), right?
15:27:27 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Ping timeout: 246 seconds)
15:27:50 <Inst_> well tbh maybe i can exploit laziness and the fact that seq won't force the evaluation beneath a tuple
15:27:53 <EvanR> no but that's looks groovy before I've had coffee
15:28:25 nick4 joins (~nick@2600:8807:9084:7800:6937:8c50:52d4:31ba)
15:28:51 <Inst_> so i can still have an infinite list with seq, just it can't be on the top level, right?
15:28:51 <EvanR> if you have 2 parallel accumulators that's just a foldl using a tuple
15:29:35 <Inst_> iirc even if you seq a list, it won't trigger a bottom, right? You'd need force from deepseq to trigger a bottom from an infinite list?
15:29:44 <geekosaur> yes
15:29:51 <geekosaur> `seq` is only to WHNF
15:30:14 <EvanR> > [undefined] `seq` '👍'
15:30:16 <lambdabot> '\128077'
15:32:34 <Inst_> but tbh foldr stil lworks better if i'm working with lists, no?
15:33:01 <Inst_> since the foldr can lazily generate the list, whereas foldl' will have to complete the list before it can produce any output?
15:33:03 <EvanR> foldr is pretty bad when adding up a list for example
15:33:15 <EvanR> unless you're scanning for all intermediate sums
15:33:22 <Inst_> i mean foldr (:) is performant, no?
15:33:30 <Inst_> foldr (:) []
15:33:36 <EvanR> that's lazy
15:33:47 <EvanR> which is good
15:34:49 <EvanR> foldl and foldl' don't work on infinite lists
15:35:15 <Inst_> the problem is that i don't feel like map is powerful enough for it, i.e, there's an implicitly mutating accumulator here
15:35:26 <EvanR> :t mapAccum
15:35:26 <Inst_> was looking at map accum, but not familiar with it, was thinking scanr / scanl, but not used to it
15:35:27 <lambdabot> error:
15:35:27 <lambdabot> • Variable not in scope: mapAccum
15:35:27 <lambdabot> • Perhaps you meant one of these:
15:35:31 <EvanR> :t mapAccumR
15:35:32 <lambdabot> Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)
15:35:50 <EvanR> :t mapAccumL
15:35:51 <lambdabot> Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)
15:36:18 <EvanR> it's map with an accumulator
15:36:47 <Inst_> maybe mapaccum is the best solution here
15:37:27 econo_ joins (uid147250@id-147250.tinside.irccloud.com)
15:38:58 bontaq joins (~user@ool-45779b84.dyn.optonline.net)
15:39:59 × mmhat quits (~mmh@p200300f1c716433cee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 4.0.1)
15:40:20 × titibandit quits (~titibandi@user/titibandit) (Remote host closed the connection)
15:41:27 × juri_ quits (~juri@84-19-175-187.pool.ovpn.com) (Ping timeout: 246 seconds)
15:42:28 Sgeo joins (~Sgeo@user/sgeo)
15:49:14 JanusTroelsen[m] joins (~janustmat@2001:470:69fc:105::3:7e89)
15:53:18 juri_ joins (~juri@84-19-175-187.pool.ovpn.com)
15:54:13 × danse-nr3_ quits (~francesco@151.57.136.214) (Read error: Connection reset by peer)
16:00:29 × nick4 quits (~nick@2600:8807:9084:7800:6937:8c50:52d4:31ba) (Ping timeout: 246 seconds)
16:00:51 × dhil quits (~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 245 seconds)
16:00:56 <ski> Inst_ : why accumulator ?
16:02:44 jinsl joins (~jinsl@2408:8207:2550:b730:211:32ff:fec8:6aea)
16:04:24 × Ross[m] quits (~zhichuche@2001:470:69fc:105::3:584b) (Remote host closed the connection)
16:07:23 <Inst_> let's say you're doing a vigenere cipher
16:07:32 <Inst_> the way i'm doing it is that i'm encoding the key as a list of ints (offsets)
16:08:38 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec)
16:09:09 <Inst_> bleh, my brain is dead
16:10:27 <ski> sounds reasonable, so far
16:11:10 <Inst_> maybe there's an easier way to do it
16:11:17 <Inst_> i need zip to be able to skip whitespace and symbols, etc
16:11:44 × mei quits (~mei@user/mei) (Remote host closed the connection)
16:11:50 <ski> hm, i see
16:12:06 <ski> so you're keeping the key as the accumulator, yes ?
16:12:54 _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
16:13:02 <Inst_> yeah
16:13:08 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
16:13:25 <Inst_> anyways, moved onto a different problem, which is figuring out how to get haskell win32 to replicate the clipboard copy function
16:14:10 mei joins (~mei@user/mei)
16:14:38 <EvanR> are you using win32 bindings or something
16:15:12 <Inst_> should I be using something else?
16:15:22 <EvanR> no just wondering
16:15:22 <Inst_> "type HANDLE = Ptr ()"
16:19:38 nick4 joins (~nick@50.86.118.19)
16:22:49 <Inst_> https://hackage.haskell.org/package/Clipboard
16:22:51 <Inst_> this is just a better idea
16:24:51 <Inst_> okay, does not support Wayland
16:24:52 <Inst_> doip
16:25:01 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 245 seconds)
16:26:31 <Inst_> provisionally:
16:26:32 <Inst_> https://paste.tomsmeding.com/RLzR9DHm
16:26:46 × barcisz quits (~barcisz@79.191.32.38.ipv4.supernova.orange.pl) (Quit: Connection closed)
16:28:55 <Inst_> okay, and it works, with some typos
16:30:48 × dtman34 quits (~dtman34@c-76-156-89-180.hsd1.mn.comcast.net) (Ping timeout: 240 seconds)
16:30:53 <EvanR> \o/
16:31:57 <Inst_> btw why is there only mapAccumL not mapAccumL'?
16:32:06 × nick4 quits (~nick@50.86.118.19) (Ping timeout: 245 seconds)
16:32:16 dtman34 joins (~dtman34@c-76-156-89-180.hsd1.mn.comcast.net)
16:37:39 <int-e> because the result of the accumulator function is forced? (the pair has to be deconstructed)
16:38:09 <EvanR> I see a 10 year old mailing list thread on the topic and it seems to be an episode in the debate on why sum should be foldl and not foldl'
16:38:18 <int-e> s/accumulator/step/
16:38:40 <EvanR> deconstruct a pair doesn't force the accumulator though
16:39:47 <int-e> But you have the power to do so inside the step function.
16:40:05 Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542)
16:40:08 <int-e> a `seq` c `seq` (a,c)
16:41:01 <int-e> With foldl, you don't have that ability.
16:41:10 <EvanR> I was about to say
16:41:36 <int-e> So having `foldl'` is practically a necessity.
16:43:04 <int-e> (Also, there are two elements in that pair so if you start offering strict versions of mapAccumL, do you force both or only one of them, or do you provide four variants? And how do you name them?)
16:43:26 <EvanR> I see, foldl immediately recurses to the end of the list before doing anything else, mapAccumL sets up a chain of (non-lazy) tuples
16:43:48 <EvanR> so your code is running at each step
16:44:23 <EvanR> or...
16:45:25 <Inst_> ffff
16:45:54 <Inst_> jesus christ, someone talked me into using if then else for when you only have two alternatives, but even though it's more terse, i somehow feel that guards are still more readable overall
16:45:56 <int-e> ffffine?
16:46:20 <int-e> (too slow)
16:46:55 <dolio> I usually prefer guards, I think.
16:47:11 <dolio> Unless it's in the middle of some other expression.
16:48:30 <int-e> yeah it's situational
16:48:34 <EvanR> ok like scanl mapAccumL on list works as long as you carefully consume the result, and via magic of update frames, you don't hold on to old accumulators
16:55:07 <Inst_> is it really smelly to immediately map into an IO action before binding it?
16:55:26 <Inst_> say, transform <$> getLine
16:55:39 <EvanR> miranda guards ftw https://paste.tomsmeding.com/LABOLtZy
16:57:40 <tomsmeding> Inst_: that's a common pattern
16:57:50 × fendor quits (~fendor@2a02:8388:1640:be00:821b:25b5:c8f3:73a0) (Remote host closed the connection)
16:59:59 <EvanR> lines <$> getContents -- 😎
17:01:51 <[exa]> Inst_: is it really "before" binding it?
17:02:25 azimut joins (~azimut@gateway/tor-sasl/azimut)
17:02:45 <EvanR> stuff <- getLine <&> transform -- there you go
17:03:48 <Inst_> afaik IO is strict, no?
17:04:02 <Inst_> it's only lazy when you unsafeInterleaveIO it, and some IO functions have built-ins, no?
17:04:08 <[exa]> it is, with respect to other IO actions
17:04:09 <Inst_> erm, built-in unsafeInterleaveIO?
17:06:38 <[exa]> but binding doesn't technically "do" anything so it's pretty hard to say "when" (or even if) it happens
17:07:07 jmdaemon joins (~jmdaemon@user/jmdaemon)
17:08:36 <tomsmeding> Inst_: if X is a normal IO action, then f <$> X will first fully complete X, and then apply f to the result
17:09:01 misterfish joins (~misterfis@84-53-85-146.bbserv.nl)
17:09:17 <tomsmeding> indeed for things that implement "lazy IO", like getContents, readFile, and perhaps also getLine, there is some unsafeInterleaveIO happening so that the IO is happening on-demand as consumers need its result
17:09:50 <tomsmeding> but f doesn't demand X's result -- if f's result is unused, still nothing happens
17:10:13 <tomsmeding> or, well, IO's (>>=) evaluates the result of the LHS to WHNF, so something might happen, but probably not much
17:10:23 × ripspin quits (~chatzilla@1.145.156.103) (Remote host closed the connection)
17:10:52 <tomsmeding> but there's little difference between 'do { tmp <- getLine ; let stuff = transform tmp ; ...}' and 'do { stuff <- transform <$> getLine ; ... }'
17:11:11 <EvanR> getLine from System.IO at least blocks until it gets a whole line
17:11:15 <tomsmeding> I think not even a WHNF laziness difference, if IO's fmap is consistent with its (>>=)
17:11:18 <tomsmeding> ah
17:12:44 <EvanR> in some languages there's a style convention to put I/O statements like getLine on their own line, resulting in an increase in variable names
17:12:56 <EvanR> instead of doing a lot on one line
17:14:10 <Inst_> Some or most?
17:14:38 × perrierjouet quits (~perrierjo@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 4.0.0)
17:14:43 <EvanR> no I'm going to chalk that one up to bizarre cult-like behavior
17:15:35 <EvanR> chaining operations together reduces variable naming
17:17:53 <Inst_> but isn't variable naming useful? Like, some programmers don't believe in anonymous lambdas
17:18:15 <dolio> Sometimes. Sometimes not.
17:18:36 <Inst_> Going into Python, I get chortles when I insist on keeping the Haskell idiom of named lambdas and actually assigning them before I use them.
17:18:40 <dolio> Just like parentheses. Sometimes they make things clearer. Sometimes they make things less clear.
17:19:11 <EvanR> yeah you can't go into python acting like it's haskell
17:19:27 × mbuf quits (~Shakthi@49.207.178.186) (Quit: Leaving)
17:19:41 <Inst_> I've read in places actually naming your lambdas somehow improves performance
17:19:55 <EvanR> that's annoying
17:20:05 <Inst_> Python is annoying, what else is new?
17:20:40 <EvanR> they should introduce an internal name on your behalf then xD
17:21:07 <EvanR> make it two for good measure
17:21:25 jinsun joins (~jinsun@user/jinsun)
17:21:38 × ubert quits (~Thunderbi@2a02:8109:abc0:6434:2722:db0d:9dca:9984) (Read error: Connection reset by peer)
17:22:52 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
17:25:24 captnemo joins (~captnemo@193.32.127.239)
17:31:17 nick4 joins (~nick@2600:8807:9084:7800:dc97:418d:c7fc:117f)
17:36:52 <EvanR> int-e, https://mail.haskell.org/pipermail/libraries/2012-November/018766.html 🤔
17:36:57 × ystael quits (~ystael@user/ystael) (Ping timeout: 246 seconds)
17:39:29 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
17:41:52 × misterfish quits (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 245 seconds)
17:43:49 × comerijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 240 seconds)
17:46:29 danse-nr3 joins (~francesco@151.43.173.33)
17:46:45 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 246 seconds)
17:49:33 × dibblego quits (~dibblego@haskell/developer/dibblego) (Ping timeout: 246 seconds)
17:49:53 dibblego joins (~dibblego@116-255-1-157.ip4.superloop.au)
17:49:53 × dibblego quits (~dibblego@116-255-1-157.ip4.superloop.au) (Changing host)
17:49:53 dibblego joins (~dibblego@haskell/developer/dibblego)
17:50:05 <int-e> EvanR: oh hmm. I guess the issue then is that let !(x,y) = mapAccumL (\a b -> let !x = a+b in (x, ())) 0 [1..1000000 :: Int] gives you a big unevaluated thunk for x.
17:51:14 <int-e> But if you evaluate the resulting `y` to the end, that will also evaluate x.
17:51:24 misterfish joins (~misterfis@84-53-85-146.bbserv.nl)
17:51:37 <EvanR> aiui it depends on what you do next, look at x first and you're screwed. Process all of y you're not
17:51:41 × Lewix quits (uid158496@id-158496.tinside.irccloud.com) (Quit: Connection closed for inactivity)
17:52:16 <int-e> yeah as I was trying to say
17:52:29 <EvanR> that bang(x,y) doesn't do anything right
17:52:41 <dolio> Right.
17:52:56 <dolio> Oh wait, no, it does.
17:52:59 <int-e> EvanR: well, it does *something*; it overrides the default laziness of `let`.
17:53:23 <EvanR> default laziness?
17:53:25 <dolio> It only does something with respect to code that wasn't written, though.
17:53:28 <int-e> EvanR: but it doesn't do much in this context because `mapAccumL` is using a lazy-in-state state monad.
17:53:40 <int-e> > let (x,y) = undefined in ()
17:53:41 <lambdabot> ()
17:53:43 <int-e> > let !(x,y) = undefined in ()
17:53:44 <lambdabot> *Exception: Prelude.undefined
17:54:28 <int-e> So there's room for a mapAccumL variant that uses a strict-in-state state monad.
17:55:12 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 245 seconds)
17:56:23 <EvanR> would that hypothetically mean you don't have to be as careful with the results?
17:58:42 <dolio> If mapAccumL gets inlined, does GHC just figure out the strictness?
17:59:34 <dolio> Similar to sum on particular types.
18:00:09 × nurupo quits (~nurupo.ga@user/nurupo) (Quit: nurupo.ga)
18:00:20 <int-e> @where L.hs
18:00:20 <lambdabot> what lambdabot has in scope is at https://silicon.int-e.eu/lambdabot/State/Pristine.hs
18:00:24 nurupo joins (~nurupo.ga@user/nurupo)
18:01:05 <int-e> @let import Control.Monad.State.Strict as S'
18:01:07 <lambdabot> Defined.
18:01:56 <dolio> Strict State isn't strict in the state value. It just forces the tuple in (>>=) or something.
18:02:08 <EvanR> let (x,y) = undefined in () ==> (), case undefined of (x,y) -> () ==> CRASH, case undefined of ~(x,y) -> () ==> (), .....
18:02:25 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
18:02:37 <int-e> > fst $ S'.runState (traverse (\a -> S'.modify (+a) >> get) [1,2,undefined]) 0
18:02:39 <lambdabot> [1,3,*Exception: Prelude.undefined
18:02:54 <int-e> > fst $ S'.runState (traverse (\a -> S'.modify' (+a) >> get) [1,2,undefined]) 0
18:02:55 <lambdabot> *Exception: Prelude.undefined
18:03:15 int-e is confused
18:04:18 <int-e> Oh, wait, the lazy state monad is lazy in the (s,a) pairs produced by the intermediate actions.
18:04:19 <EvanR> the last one is most strict
18:04:42 <EvanR> yeah
18:05:03 <EvanR> that's what I was originally looking at but didn't realize the "default laziness of let"
18:05:06 <int-e> (It has been a while since I needed that information.)
18:05:35 <dminuoso> jackdk: Yes, and largely undocumented. You have to refer to the original PhD thesis and Edwards repositories to know how to use backpack.
18:05:36 <int-e> > runState (undefined >> put 2) 0
18:05:37 <lambdabot> error:
18:05:38 <lambdabot> Ambiguous occurrence ‘runState’
18:05:38 <lambdabot> It could refer to
18:05:46 <int-e> ah
18:05:47 <int-e> @undef
18:05:47 <lambdabot> Undefined.
18:05:59 <int-e> @let import qualified Control.Monad.State.Strict as S'
18:06:00 <lambdabot> Defined.
18:06:05 <int-e> > runState (undefined >> put 2) 0
18:06:07 <lambdabot> ((),2)
18:06:14 <int-e> > S'.runState (undefined >> S'.put 2) 0
18:06:15 <lambdabot> *Exception: Prelude.undefined
18:06:44 <EvanR> I really need to upgrade my visual reasoning of evaluating chains of let (a,b) = ...
18:07:38 × chexum quits (~quassel@gateway/tor-sasl/chexum) (Ping timeout: 240 seconds)
18:07:40 <int-e> are you aware of selector thunks?
18:07:46 <EvanR> nope
18:09:59 <int-e> (They're obscure. Basically, functions like `fst` and `snd` have a special heap representation. The point is, if you have lots of chained let (a,b) = f (...) where f is lazy (like in the state monad), then `a` becomes, effectively, `fst (f (...))` so you could easily end up with thunks of the shape `fst (fst (...),...)`
18:11:00 <int-e> When proceeding with lazy evaluation. That's not good. So the garbage collector has code to recognize that case and evaluate those selectors when their argument is a value (not a thunk).
18:11:04 × acarrico quits (~acarrico@dhcp-68-142-49-163.greenmountainaccess.net) (Quit: Leaving.)
18:11:27 chexum joins (~quassel@gateway/tor-sasl/chexum)
18:11:39 reio joins (~reio@86-90-81-176.fixed.kpn.net)
18:11:51 <int-e> To do that, it has to know when a function is a selector, so selectors like `fst` have a special closure type in the RTS for that purpose.
18:12:13 × justsomeguy quits (~justsomeg@user/justsomeguy) (Quit: WeeChat 3.6)
18:13:04 <int-e> And it's somewhat brittle... inlining and let-floating can turn what would be selectors into more complicate closures that are no longer selectors and then the garbage collector can no longer evaluate them on the spot and that can cause space leaks that are really hard to understand :)
18:13:17 <int-e> (this is basically how I learned about selector thunks)
18:15:34 <EvanR> so a = fst(some thunk) and b = snd(SAME thunk), but at some point the argument may become a value, and even though no one demanding a, it can be simplified
18:15:47 <int-e> yep
18:16:14 <int-e> and b too
18:16:46 <EvanR> and if that is compounded by recursion like in scanl, the gc can repeatedly come in to stop a from building up
18:17:11 <EvanR> then what's an update frame? xD
18:17:30 acarrico joins (~acarrico@dhcp-68-142-49-163.greenmountainaccess.net)
18:17:52 <int-e> That's something on the stack, not on the heap, keeping track of where to put return values of closures.
18:17:55 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection)
18:18:02 <int-e> I understand those less well than selector thunks.
18:18:29 <hololeap> I'm looking for some in-depth info on how to profile a data structure for unwanted laziness
18:19:25 × captnemo quits (~captnemo@193.32.127.239) (Quit: WeeChat 3.8)
18:20:03 <int-e> But there is an optimization (during GC I think?) that collapses update frames on the stack if there are several for the same thunk (which are, IIRC, easy to detect because they'll always be consecutive update frames).
18:20:26 <EvanR> wow the GC is doing a lot
18:22:06 <EvanR> why would there be many update frames for the same thunk
18:22:18 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec)
18:23:18 <geekosaur> "accumulator" for a fold?
18:24:20 notzmv joins (~zmv@user/notzmv)
18:25:15 <EvanR> well I think my main confusion was coming from the selector thunks anyway, thanks for that
18:26:48 tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
18:32:44 <EvanR> > let Just () = Nothing in ()
18:32:46 <lambdabot> ()
18:33:12 <EvanR> is there a selector thunk which checks the sum type's tag too
18:33:25 <int-e> no
18:33:46 <EvanR> let Just a = Nothing in something something a something something, now what would a be
18:34:33 × biberu quits (~biberu@user/biberu) (Read error: Connection reset by peer)
18:35:14 <EvanR> whatever it is, defensively evaluating it would be bad right
18:35:19 <int-e> (It's not *overly* useful because it would basically only work when you know which constructor the return value will have... I mean we're talking about functions like `fromJust`. In which case, you can and arguably should refactor the code to not produce the constructor in the first place.)
18:35:46 <EvanR> yeah but that code does something
18:36:34 <int-e> While the chained selectors-on-tuples is actually common when writing loops-as-recursion
18:36:48 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
18:37:35 <EvanR> > let Just a = Nothing in [1,2,a,4,5]
18:37:37 <lambdabot> [1,2,*Exception: <interactive>:3:5-20: Non-exhaustive patterns in Just a
18:37:50 <EvanR> > fromJust Nothing
18:37:52 <lambdabot> *Exception: Maybe.fromJust: Nothing
18:38:11 <int-e> it's just an ordinary thunk
18:38:18 biberu joins (~biberu@user/biberu)
18:38:24 <EvanR> containing what, a case
18:39:05 <int-e> It's more or less `let a = case Nothing of Just a => a in ...`
18:39:28 × misterfish quits (~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 240 seconds)
18:39:33 <EvanR> groovy
18:40:13 <EvanR> so selectors are specifically for data types with 1 constructor
18:40:20 <int-e> IIRC the Haskell report actually has desugarings for this stuff (pattern matches, including irrefutable ones).
18:40:53 <int-e> "irrefutable" being the report's term for what we call "lazy matching"
18:42:44 <geekosaur> EvanR, don't forget field selectors
18:43:10 <int-e> EvanR: selector thunks, yes.
18:43:24 <EvanR> explicit use of field selectors produces a selector thunk too?
18:43:41 <int-e> not if there is more than one data constructor
18:43:48 <EvanR> got it
18:44:19 <int-e> obviously this is a deep implementation detail of ghc
18:44:48 <int-e> (though hugs also did thise kind of thing... and probably everybody else too, at least for pairs)
18:48:48 k`` joins (~user@152.7.255.193)
18:49:26 <k``> Is there an easy way to do a reverse dependency search for packages?
18:49:55 <ncf> https://packdeps.haskellers.com/reverse
18:50:06 <k``> Thanks!
18:50:11 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
18:50:45 acidjnk joins (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de)
18:50:51 × danse-nr3 quits (~francesco@151.43.173.33) (Ping timeout: 245 seconds)
18:51:17 <k``> Now I just need to figure out how much of the API they depend on...
18:54:47 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
18:55:13 × trev quits (~trev@user/trev) (Quit: trev)
19:02:03 __monty__ joins (~toonn@user/toonn)
19:05:48 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
19:06:38 × stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 240 seconds)
19:08:53 falafel joins (~falafel@2603-7000-a700-8710-770e-b4b3-5186-ab58.res6.spectrum.com)
19:10:45 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
19:17:46 <EvanR> > if 4 > 9000; then "over 9000!"; else ""
19:17:47 <lambdabot> ""
19:17:51 <EvanR> > if 4 > 9000; then "over 9000!"; else "";
19:17:52 <lambdabot> <hint>:1:40: error: parse error on input ‘;’
19:19:48 <geekosaur> you don't actually need those, do you?
19:20:02 <geekosaur> > if 4 > 9000 then "over 9000!" else ""
19:20:04 <lambdabot> ""
19:20:09 <geekosaur> that's what I thought
19:20:26 stiell_ joins (~stiell@gateway/tor-sasl/stiell)
19:20:37 <monochrom> But they are allowed because of DoIfThenElse which is now part of Haskell2010.
19:20:38 <mauke> the semicola are optionally allowed in an if-then-else expression to make do-notation slightly less annoying
19:20:56 <geekosaur> yeh
19:21:25 <EvanR> DoIfThenElse?
19:21:29 <mauke> did you know import lists allow trailing commata?
19:21:55 <monochrom> In fact, DoIfThenElse is defined to just mean allowing ; so that it is a minimal change to the grammar. :)
19:21:56 <geekosaur> EvanR, that alters indentation rules
19:22:03 <geekosaur> iirc
19:22:16 <monochrom> I have only tried export list trailing commas.
19:22:36 <monochrom> Also I will raise the endiar war between "commata" and "commae" >:D
19:22:36 <geekosaur> since it's an expression, `then` and `else` should be indented, but iirc `DoAndIfThenElse` relaxes that?
19:22:48 <monochrom> raise? rage? wage?
19:23:20 <geekosaur> "commoi"
19:23:48 geekosaur is now known as greekosaur
19:23:55 <monochrom> Yes, if you don't indent "then" and "else", then layout processing adds ";". Then DoAndIfThenElse just needs to say ";" is OK.
19:24:17 <monochrom> It's an ingenious life hack.
19:24:21 greekosaur is now known as geekosaur
19:25:35 wootehfoot joins (~wootehfoo@user/wootehfoot)
19:26:26 × gurkenglas quits (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) (Ping timeout: 250 seconds)
19:26:36 × mei quits (~mei@user/mei) (Remote host closed the connection)
19:28:35 <EvanR> wow that is sneaky as hell
19:28:53 <monochrom> :)
19:29:10 <monochrom> My thought when I first saw it.
19:30:02 <EvanR> but no 3rd ; is needed?
19:30:06 <monochrom> You don't even need to change the layout rules.
19:30:07 <EvanR> (or allowed)
19:30:23 <monochrom> You can have the 3rd ; in a do-block.
19:30:54 <mauke> you don't want the statement after if-then-else to be swallowed by the else part
19:31:00 <monochrom> > do if 4 > 9000; then "over 9000!"; else "";
19:31:01 <lambdabot> ""
19:31:20 <monochrom> Your life is complete. :)
19:31:32 <EvanR> and this is a haskell2010 thing
19:31:36 <monochrom> Yes.
19:32:04 × dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 250 seconds)
19:32:07 <mauke> > do if do 4 > do 9000; then do "over 9000!"; else do "";
19:32:09 <lambdabot> ""
19:32:25 dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net)
19:32:39 <EvanR> > do do do do do "batman!"
19:32:40 <monochrom> deep dodo
19:32:40 <lambdabot> "batman!"
19:32:52 <mauke> I don't know if you can fit any extra semicola in there now
19:32:58 <monochrom> batmonad
19:34:06 <monochrom> > do if do 4 > do 9000;;;;;; then do "over 9000!";;;;; else do "";;;;;
19:34:07 <lambdabot> ""
19:34:19 <monochrom> Beethoven Virus but semicolons.
19:34:25 mei joins (~mei@user/mei)
19:35:31 <mauke> > do;; if do 4;; > do 9000;; then do "over 9000!";; else do;; do "";;
19:35:32 <lambdabot> ""
19:36:53 <hololeap> so, here you can see the flamegraph output of my command: https://eidetic.codes/hackport.html
19:37:20 <hololeap> the actual command is: ./dist-newstyle/build/x86_64-linux/ghc-9.2.8/hackport-0.8.4.0/x/hackport/build/hackport/hackport --bash-completion-index 2 --bash-completion-word hackport --bash-completion-word merge --bash-completion-word Cabal +RTS -I0 -A128M -N -pj -hc -l
19:38:46 <hololeap> the main block of relevant code is here: https://github.com/gentoo-haskell/hackport/blob/master/src/Hackport/Completion.hs#L82-L129
19:39:29 <hololeap> it seems like that's an excessive amount of GC.GC and IDLE.IDLE, but I don't really know
19:41:31 <hololeap> and when I've asked in here before I either get "I don't know" or crickets, but surely there must be some information out there on how to investigate why there is so much garbage being generated
19:45:03 <hololeap> in this case, it is reading a Trie from a binary file and running Trie.lookup on it
19:45:19 <hololeap> https://github.com/gentoo-haskell/hackport/blob/master/src/Data/Trie.hs
19:53:17 <EvanR> a lot of garbage *generated* seems par for the course
19:53:34 perrierjouet joins (~perrierjo@modemcable048.127-56-74.mc.videotron.ca)
19:53:36 <EvanR> if it's not being collected soon then it's potentially a problem
19:55:36 Pickchea joins (~private@user/pickchea)
19:57:19 × wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
19:57:28 <hololeap> is the GC.GC and IDLE.IDLE at the beginning some sort of unavoidable startup for the runtime?
19:59:13 × jrm quits (~jrm@user/jrm) (Quit: ciao)
20:00:34 jrm joins (~jrm@user/jrm)
20:01:11 <int-e> hololeap: hmm the idling may be waiting for external commands?
20:01:20 lainon joins (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39)
20:01:39 <int-e> you could try +RTS -I0 -RTS to disable the idle GC and see if that reduces the proportion of GC time
20:02:01 <int-e> ("-I<sec> Perform full GC after <sec> idle time (default: 0.3, 0 == off)")
20:02:21 <hololeap> hm, well it already is running with +RTS -I0
20:02:39 <int-e> ah, I missed that.
20:03:02 machinedgod joins (~machinedg@d198-53-218-113.abhsia.telus.net)
20:04:40 <int-e> hmm, -N, how many cores will that end up using?
20:06:31 × lainon quits (~textual@2601:7c0:cb00:c0a0:718c:10e2:ff4c:a39) (Quit: Textual IRC Client: www.textualapp.com)
20:06:35 <hololeap> 4 in this case, is that going to be a problem? -N is actually set in ghc-options: ... -with-rtsopts=-N
20:07:33 <int-e> Well it might explain the idle thing... expecially if the actuaal work load has only one thread
20:07:54 <int-e> So trying with -N1 seems to be a worthwhile experiment at least?
20:08:02 <hololeap> yeah, I'll try that
20:08:19 <int-e> It shouldn't dramatically affect the GC time though which is your real question
20:08:44 <int-e> (I think)
20:08:47 <EvanR> whoa https://github.com/sdiehl/write-you-a-haskell (not necessarily in 24 hours)
20:10:17 <int-e> Hmm, 2+ years, unfinished?
20:10:29 <hololeap> so the whole point of this is to add bash completion to the `hackport merge` command, which takes a package/version that exists in the hackage database. the list of package/versions is cached in a trie which is serialized via binary to a file. on subsequent runs, it should deserialize the cache file and run a lookup on the trie.
20:10:59 <hololeap> with bash completion, adding a second or two feels really sluggish, so I was trying to squeeze a bit more speed out of it
20:11:31 <hololeap> (just some background)
20:11:32 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds)
20:12:07 <int-e> hmm, a second or two... did you say how big the serialized data is?
20:12:25 <hololeap> I think it's around 150,000 entries?
20:13:01 <hololeap> but you can see from that flamegraph thing that quite a bit of time is spent at the beginning before it even enters main
20:13:33 <int-e> I don't think you see that
20:13:51 <int-e> I think you're seeing *total* times spent in various parts of the program
20:14:02 <hololeap> oh, ok
20:14:08 alternateved joins (~user@77-254-166-50.dynamic.inetia.pl)
20:14:09 <int-e> and GC.GC is first only because it's the biggest chunk
20:14:53 <hololeap> I'm also interested in this because the understanding I gain will really help me in the future projects
20:16:03 <hololeap> for instance, I was told adding `LANGUAGE Strict` to my Data.Trie is clumsy and may not do what I expect, but I wasn't told what the _proper_ solution there is either
20:16:14 <int-e> I guess the generic recipe for reducing GC times without modifying the program is to increase heap size (both -A and -H may be relevant)
20:17:18 <davean> hololeap: you can profile allocations. Also including what closures, etc allocates them - have you done such? Also I see comments above about -N, but have you tried disabling parallel GC?
20:17:22 × tzh quits (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: jdvkjb)
20:17:54 <hololeap> davean: I'm not sure how to do any of this
20:18:56 <hololeap> I see the -pa runtime argument in the chapter on profiling
20:19:01 × acidjnk quits (~acidjnk@p200300d6e7072f0600a8e9aef9077b5f.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
20:19:03 <davean> add "+RTS -?" to your commend to get options (build with profiling enabled, and RTS options enabled)
20:19:17 <int-e> why is the top user of runtime somewhere in hackage-security
20:19:21 <davean> ps are about time, you want heap, which is h
20:19:33 <int-e> (if the flame graph is to be trusted)
20:20:23 <davean> int-e: I would expect that if not much was being done in the program at all.
20:20:49 <hololeap> int-e: that's a good question and has to do with the way the program was originally structured
20:21:22 <int-e> hololeap: the reason I'm asking is really that I'm wondering whether you're blaming the right thing for taking so much time
20:21:54 <hololeap> int-e: I would love to know how to find out
20:22:28 acidjnk joins (~acidjnk@p200300d6e7072f06a5c472a3c7963a83.dip0.t-ipconnect.de)
20:22:32 <hololeap> from the profiling data, rather than start chopping parts off until it goes fast
20:22:41 <int-e> (and often, time correlates with allocations, and allocations trigger GCs, so it's all related to the high GC activity)
20:22:51 <int-e> (well, potentially related)
20:23:06 <davean> Is the GC activity high? Its a flame graph so i can't tell
20:23:14 <davean> I'd kill for an actual graph
20:23:24 <hololeap> davean: I can provide other files, what do you want
20:23:25 <int-e> well the graph suggests 40%+ GC time
20:23:28 <jade[m]> davean: pls don't
20:23:55 <davean> hololeap: I mean the actual profile file would be great, but I'm not going to spend much time on this ATM
20:24:28 <hololeap> davean: the .prof in json or what format?
20:24:42 <davean> the .prof in standard format
20:24:49 <int-e> tbh I'd like to see the percentages from `+RTS -s` just to support or refute the flame graph
20:26:00 × reio quits (~reio@86-90-81-176.fixed.kpn.net) (Ping timeout: 246 seconds)
20:27:59 <davean> actually I can generate all this myself unless its a quirk of your system - whats the repo, do you have a nix file for it, and what do you want profiled? I might do it between stuff tonight
20:28:44 <hololeap> here's the output with +RTS -s: http://sprunge.us/VJ9cxA
20:28:52 <hololeap> here's the .prof file: http://sprunge.us/3h8TNy
20:29:29 <hololeap> davean, I don't have a nix file, but I'm using master from here: https://github.com/gentoo-haskell/hackport
20:29:31 <int-e> so that confirms 40%-50% GC time
20:29:42 <geekosaur> if this turns out to be in hackage-security then #hackage will want to hear about it
20:30:07 <davean> Its only allocating like 357MiB, how long is this taking?
20:31:12 <hololeap> well, +RTS -N1 -qg -RTS seemed to speed it up quite a bit: total time = 1.15 secs
20:31:30 <int-e> "227MB copied during GC" is what makes GC expensive
20:32:01 <davean> Yah but even that means this is a VERY slow system it is on - how big is the datafile? We can look at how it is parsed.
20:32:13 <davean> You don't happen to be using lazy IO by any chance?
20:32:47 <hololeap> I'm using encodeFile from Data.Binary
20:33:00 <hololeap> encodeFile/decodeFile
20:34:56 <hololeap> https://github.com/gentoo-haskell/hackport/blob/master/src/Hackport/Completion.hs#L115-L118
20:35:45 <hololeap> I forgot I put this into a compact region as an experiment, which doesn't seem to affect anything
20:37:01 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
20:37:06 <davean> hololeap: and what is the actual command you're running that should be profiled?
20:37:19 <hololeap> it's in the .prof file I just pasted
20:37:25 <davean> If it isn't too much of a pain to get build I probably can look at it in a few hours.
20:37:51 <davean> Ok, are any of the RTS options important?
20:38:02 <davean> You have both -N and -N1 for example
20:38:25 <EvanR> haskell report section on the context-free grammar doesn't mention whitespace at all. Is the idea that whitespace is dropped in the process of doing the layout algorithm
20:38:27 <hololeap> -N is added in the cabal file via --with-rtsopts
20:38:41 <hololeap> it was suggested that I turn it off for this
20:39:13 <hololeap> I think that optparse-applicative is adding the -I0 -A128M
20:39:19 <geekosaur> EvanR, it's typically removed during lexing, as it's either layout or a way to separate tokens
20:39:20 <mauke> whitespace is the lexer's problem
20:39:34 <darkling> Depends on your lexer rules. :)
20:39:39 <mauke> which is why most grammars are useless for finding polyglots
20:39:45 <EvanR> ok but the layout algorithm requires knowing all about whitespace to do its thing
20:39:55 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
20:40:09 <mauke> I don't think layout cares about whitespace, really
20:40:15 <mauke> just columns
20:40:23 <geekosaur> right, but you'll note the layout algorithm is in terms of inserting special tokens, which means it happens during lexing for the most part
20:40:28 fgaz_ joins (1ff9197ed6@2604:bf00:561:2000::11ea)
20:40:51 <EvanR> alright
20:40:52 <geekosaur> remember the {n} asnd <n> tokens?
20:41:01 <int-e> hololeap: Hmm, "trieFile >>= decodeFile >>= compact" ... GHC.Compact.compact is not going to pay off for you I think.
20:41:24 <hololeap> int-e: yeah I found that out, but apparently left it in the commit
20:41:24 <EvanR> yeah, it says they exist. I guess whitespace turned into {n} and <n> tokens prior to layout
20:41:32 <geekosaur> yep
20:42:51 <EvanR> though you might want to attach line and column numbers to tokens for reasons?
20:43:07 <dolio> EvanR: BTW, you might be interested in the references here: https://github.com/haskell/happy/issues/235
20:43:10 <geekosaur> yes, and ghc for example does that
20:43:27 <int-e> hololeap: I'm still confused though... shouldn't the whole cabal-install/hackage-security code path be skipped if the cache exists?
20:44:58 <hololeap> int-e: yes it should, I haven't gotten to that yet. I was really just trying to understand the GC usage
20:45:27 <int-e> hololeap: so, tentatively, I suspect `choice` may not be as lazy as you expect
20:51:02 <int-e> > runWriter $ runMaybeT $ asum [lift (tell [1]) >> pure "Ok", lift (tell [2]) >> fail "Nope"]
20:51:03 <lambdabot> (Just "Ok",[1])
20:51:15 <int-e> This... suggests that it's lazy enough.
20:51:39 <int-e> (`choice` is defined as `asum`)
20:52:15 × nick4 quits (~nick@2600:8807:9084:7800:dc97:418d:c7fc:117f) (Ping timeout: 246 seconds)
20:52:40 × gry quits (quasselcor@botters/gry) (Ping timeout: 250 seconds)
20:53:16 <EvanR> the final section of that chapter on syntax is about disambiguating infix expressions by using fixity and precedence. It is explained in terms of a "list of tokens" which are either infixexps from the grammar (which includes operators already), operators, and negative signs
20:53:17 <dolio> > runWriter . runMaybeT $ fail "Nope"
20:53:18 <lambdabot> (Nothing,())
20:53:31 <int-e> hmmmm. what does `optional` do here
20:53:41 <EvanR> is the idea to use first get a parse tree however you can, then flatten infixexps into a list, and rearrange them?
20:54:42 <dolio> EvanR: I think so. As I recall, fixity is handled as a post-pass, not during parsing.
20:55:02 <dolio> Because you have to parse to find fixity declarations.
20:55:13 <EvanR> interesting
20:56:32 <EvanR> that adds another level to the common expectation for recursive modules to "just work"
20:57:00 <EvanR> operators defined in module A used in module B which uses operators defined in module A
20:57:22 <int-e> hololeap: maybe `decodeFile` fails? You'd never seen an error from that because `optional` suppresses it
20:57:40 <hololeap> that's intentional
20:58:06 <int-e> But it would cause you to go down the slow path. 
20:58:28 <hololeap> well, the slow path is like 20 seconds, so it's pretty noticable :3
20:58:31 <int-e> So in the interest of debugging, a message would be helpful there.
20:58:35 <hololeap> fair
20:59:34 <hololeap> also, outputting to stderr on tab completion can be pretty annoying
21:00:12 <hololeap> but in the interest of debugging, that's fine, or outputting somewhere in /tmp
21:00:20 <int-e> that's fair...
21:00:51 dhil joins (~dhil@78.45.150.83.ewm.ftth.as8758.net)
21:01:13 × kimiamania6 quits (~681cf57f@user/kimiamania) (Quit: PegeLinux)
21:01:17 × infinity0 quits (~infinity0@pwned.gg) (Remote host closed the connection)
21:01:24 <int-e> I just still don't understand why cabal-install/hackage-security show up in the flame graph here, if you're just reading that trie and then traversing it
21:01:45 kimiamania6 joins (~681cf57f@user/kimiamania)
21:02:58 × cyphase quits (~cyphase@user/cyphase) (Ping timeout: 260 seconds)
21:03:11 gurkenglas joins (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de)
21:03:24 infinity0 joins (~infinity0@pwned.gg)
21:05:45 <hololeap> int-e, I refactored and there's no more hackage-security when it reads from the cache: https://eidetic.codes/hackport.html
21:06:15 <int-e> No more IDLE.IDLE either?
21:06:34 <hololeap> yeah I guess not...
21:08:16 × coot quits (~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
21:09:00 <int-e> Of course the fact that it attributes anything to mkCompleter is dubious (it's a plain newtype data constructor)
21:09:03 drdo6 joins (~drdo@bl5-28-156.dsl.telepac.pt)
21:11:23 × drdo quits (~drdo@bl8-153-185.dsl.telepac.pt) (Ping timeout: 264 seconds)
21:11:23 drdo6 is now known as drdo
21:11:44 pavonia joins (~user@user/siracusa)
21:11:51 × k`` quits (~user@152.7.255.193) (Ping timeout: 246 seconds)
21:13:46 × dhil quits (~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 245 seconds)
21:14:18 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
21:16:35 <int-e> hololeap: That said I'm prepared to believe that the deserialization is just that slow. A standalone program that just replicates the Trie data type and does the trieFile >>= decodeFile part could confirm.
21:18:44 <int-e> Ah, with some care to force the result.
21:20:15 <int-e> which, I guess, `compact` would do for you
21:22:14 <hololeap> yeah, that sounds like a good idea, and with it isolated I could probably ask a better question in the haskell discourse or reddit
21:22:50 <hololeap> in any case, just the suggestions I've received today sped it up quite a bit, so thanks everyone
21:23:04 × __monty__ quits (~toonn@user/toonn) (Quit: leaving)
21:24:31 <EvanR> haskell reddit?
21:25:48 × tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
21:25:52 <EvanR> yep there it is
21:26:10 × _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection)
21:26:11 <int-e> is there a haskell lemmy too?
21:26:43 <EvanR> so the moderators quit
21:32:58 <Hecate> int-e: kbin.social/m/haskell
21:33:36 <EvanR> the minus sign, which means subtraction or negation (or comments) depending on who knows what, including whitespace. Seems like a lexical thing but random stackoverflow says it's more convenient to do in the parser, what a mess
21:34:01 <int-e> Hecate: ah that looks a bit more lively than https://programming.dev/c/haskell (unavoidably there are several, hmm, let's call it seeds)
21:35:05 <EvanR> it's cool that LexicalNegation did something... like make sections always work the way you think. But it's not in the haskell report here
21:37:11 <monochrom> If you write "- 5" with spaces between - and 5, it is pretty difficult for lexers, easier for lexer to just output [Minus, Num 5] and let the CFG stage deal with it.
21:43:01 m21it joins (~m21it@2800:ac:8012:135a:9aa8:aa:24dc:5f7a)
21:43:13 <EvanR> right, if I'm in the chinese room and see Minus then 5, then I could output negative 5. But if I see x then Minus then y, then x subtract y? Or x(negative y)
21:43:46 <EvanR> how did haskell's ancestors do it
21:44:48 <EvanR> who the heck came up with this notation
21:45:21 <dolio> Distinguishing subtraction from negation isn't usually lexing.
21:45:23 cyphase joins (~cyphase@user/cyphase)
21:45:36 caryhartline joins (~caryhartl@168.182.58.169)
21:46:09 <EvanR> it seems to depend on whitespace
21:46:37 <m21it> Hello! Does anyone have an idea why 2 expressions here are giving the different results? I was sure they should be equivalent for the case where key is missing, and both should insert the value 321 with the key "WORLD" https://paste.tomsmeding.com/zVIswWjv
21:49:17 <dolio> It is with LexicalNegation on, but I think it isn't in the report.
21:49:18 × EvanR quits (~EvanR@user/evanr) (Remote host closed the connection)
21:50:23 EvanR joins (~EvanR@user/evanr)
21:53:53 × michalz quits (~michalz@185.246.207.203) (Remote host closed the connection)
21:53:58 ryantrinkle joins (~ryantrink@89.247.249.243)
21:57:13 × gnalzo quits (~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.1)
22:04:10 × L29Ah quits (~L29Ah@wikipedia/L29Ah) (Ping timeout: 250 seconds)
22:05:17 × mei quits (~mei@user/mei) (Remote host closed the connection)
22:07:52 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection)
22:08:24 <hololeap> m21it, I'm not a lens expert and I had to look it up, but wouldn't `non 321` return a map which omits keys with a value of 321?
22:09:03 <hololeap> I don't see how your first expression is supposed to insert ("WORLD", 321)
22:09:50 × sagax quits (~sagax_nb@user/sagax) (Read error: Connection reset by peer)
22:10:43 mei joins (~mei@user/mei)
22:11:19 phma_ joins (~phma@2001:5b0:215a:da58:dcbf:27e8:323f:f6ce)
22:13:50 L29Ah joins (~L29Ah@wikipedia/L29Ah)
22:13:55 <ncf> that's not what non does, but it also wouldn't insert a key
22:14:11 × phma quits (~phma@host-67-44-208-87.hnremote.net) (Ping timeout: 245 seconds)
22:14:29 phma_ is now known as phma
22:17:29 × gmg quits (~user@user/gehmehgeh) (Quit: Leaving)
22:17:54 <EvanR> dolio, would you say even recognizing negative literals for their literal value is usually deferred to parsing, in most languages
22:18:41 <EvanR> outputting minus 5 instead of -5
22:19:04 <dolio> I think that's pretty common, yes.
22:21:00 <EvanR> wow, minus followed by several spaces then a 5 is accepted in C...
22:22:12 × machinedgod quits (~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 246 seconds)
22:23:59 <ncf> m21it: non 321 effectively translates between Maybe Int and Int, where 321 now represents the Nothing case. by mapping `id` over this new representation, you go from 321 to 321, i.e. from no value to no value
22:25:48 waleee joins (~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
22:30:31 <m21it> Yes, I was thinking that `non def` in this case does "insert" the `def` value in case where focus was on `Nothing`, and becoming focused on `Just def`. The `id` example was not the best because it does actually comply with identity law, but "insertion" actually happens if the function is not `id`: `ghci> x & at "WORLD" . non 321 %~ (+1)` does produce `fromList [("HELLO",123),("WORLD",322)]`
22:30:42 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec)
22:31:18 merijn joins (~merijn@088-129-128-083.dynamic.caiway.nl)
22:32:49 <ncf> Nothing <-> def
22:32:58 <ncf> Just d <-> d where d /= def
22:33:18 <ncf> note that there's no `Just def` in this picture
22:33:33 <ncf> mapping id is doing Nothing -> def -> Nothing
22:34:01 <ncf> mapping (+1) is doing Nothing -> def ↓ def + 1 -> Just (def + 1)
22:39:48 × yuuta quits (~YuutaW@2404:f4c0:f9c3:502::100:17b7) (Ping timeout: 240 seconds)
22:39:56 <m21it> Yeah, I do see the idea. My problem is probably the thinking like "I could totally use lens without full understanding of implementation details". Intuitive reasoning mostly works with them, but in some cases no - lens laws do matter
22:41:13 bilegeek joins (~bilegeek@2600:1008:b068:20a1:d82d:ec1b:27cf:aa75)
22:42:49 YuutaW joins (~YuutaW@mail.yuuta.moe)
22:46:26 × eggplantade quits (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec) (Remote host closed the connection)
22:51:36 × YuutaW quits (~YuutaW@mail.yuuta.moe) (Ping timeout: 246 seconds)
22:52:01 liftA2 joins (~user@2605:a601:a60d:5400:cdf2:29ba:eca9:602a)
22:52:28 eggplantade joins (~Eggplanta@2600:1700:38c5:d800:b9c2:276d:fb2c:5cec)
22:54:30 <liftA2> I was just looking at `text`, and it defines `smallChunkSize` to be `128 - chunkOverhead` . `chunkOverhead` is the number of bytes in 2 Words. So `smallChunkSize` is zero on most systems? Is there something I'm missing?
22:55:11 <liftA2> Never mind, got my bits and bytes crossed.
22:55:18 YuutaW joins (~YuutaW@2404:f4c0:f9c3:502::100:17b7)
22:56:01 wroathe joins (~wroathe@user/wroathe)
22:56:23 <dolio> EvanR: I'm hard pressed to think of an example where it would actually lead to perceived weirdness in most other languages. Most don't have situations like negation vs. subtraction section.
22:57:29 johnw_ joins (~johnw@69.62.242.138)
22:57:54 × johnw quits (~johnw@69.62.242.138) (Ping timeout: 246 seconds)
22:58:15 × bontaq quits (~user@ool-45779b84.dyn.optonline.net) (Ping timeout: 246 seconds)
23:02:31 × alternateved quits (~user@77-254-166-50.dynamic.inetia.pl) (Ping timeout: 245 seconds)
23:05:44 × merijn quits (~merijn@088-129-128-083.dynamic.caiway.nl) (Ping timeout: 246 seconds)
23:07:11 × Zambyte quits (~user@c-73-114-31-74.hsd1.ma.comcast.net) (Remote host closed the connection)
23:07:24 Zambyte joins (~user@c-73-114-31-74.hsd1.ma.comcast.net)
23:09:58 dmgk parts (~dmgk@user/dmgk) ()
23:10:38 <dolio> Or, like, in most languages `f -1` would not be confused with a function call, unless `f` is part of special syntax that would make `f - 1` also like a function call.
23:11:06 <dolio> (Like `print - 1`)
23:12:36 × acidjnk quits (~acidjnk@p200300d6e7072f06a5c472a3c7963a83.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
23:13:17 × caryhartline quits (~caryhartl@168.182.58.169) (Quit: caryhartline)
23:14:01 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
23:19:13 tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net)
23:21:02 azr4e1 joins (~azr4e1@2a00:23c7:9cbc:3401:45fb:9c68:12fe:262b)
23:21:08 × ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Ping timeout: 246 seconds)
23:23:11 ezzieyguywuf joins (~Unknown@user/ezzieyguywuf)
23:24:12 jero98772 joins (~jero98772@2800:484:1d7f:5d36:7b44:d981:f67d:5b1a)
23:24:47 × jero98772 quits (~jero98772@2800:484:1d7f:5d36:7b44:d981:f67d:5b1a) (Remote host closed the connection)
23:24:48 <EvanR> in reading wikipedia about precedence and parsing algorithms I see a table saying that + - * / are left associative and ^ is right associative. Are these choices good / bad / doesn't matter in haskell?
23:24:50 × mechap quits (~mechap@user/mechap) (Ping timeout: 260 seconds)
23:26:07 <EvanR> also + and * having associativity seems weird
23:26:19 <darkling> It doesn't matter for + and *. It very much matters (by convention) for -, / and ^
23:26:47 Luj5 joins (~Luj@2a01:e0a:5f9:9681:3e8f:d5c0:40b7:2d50)
23:27:13 × Luj quits (~Luj@2a01:e0a:5f9:9681:5880:c9ff:fe9f:3dfb) (Read error: Connection reset by peer)
23:27:13 Luj5 is now known as Luj
23:27:16 gry joins (quasselcor@botters/gry)
23:27:28 <EvanR> oh yeah... multiple / in a row... right
23:27:47 <darkling> You can use the other associativity for the latter three, but you're going to confuse people.
23:28:16 <EvanR> i would have expected a^b^c to be (a^b)^c I don't know why
23:28:49 <EvanR> maybe because of the way / works
23:28:50 <geekosaur> it makes more sense if you think about the other representation
23:29:24 <geekosaur> (with superscripts)
23:29:30 <darkling> I think it's the other way around because (a^b)^c is just a^(b*c) and there's a good syntax for that already.
23:29:37 <int-e> > (2^2)^2 == 2^(2^2)
23:29:38 <lambdabot> True
23:29:43 <EvanR> lol
23:29:53 <darkling> int-e: Stop that. ;)
23:33:07 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 245 seconds)
23:34:22 <DigitalKiwi> > (2^3)^4 == 2^(3^4)
23:34:24 <lambdabot> False
23:34:33 <DigitalKiwi> KiwiCheck
23:35:01 <EvanR> > 1^(2^3) == (1^2)^3
23:35:02 <lambdabot> True
23:35:19 <EvanR> so far associativity is winning 2 to 1
23:35:22 darkling cries
23:36:04 <DigitalKiwi> tears of laughter
23:36:30 <int-e> @check \a b c -> (a :: Double) + (b + c) == (a + b) + c
23:36:31 <lambdabot> *** Failed! Falsifiable (after 6 tests and 4 shrinks):
23:36:31 <lambdabot> 4.300390628860152 0.7865356995813799 -0.7580302228566115
23:36:58 <int-e> darkling: there you go, + is not associative; you're welcome.
23:37:06 <darkling> :D
23:37:15 <EvanR> I eat my words
23:37:41 <DigitalKiwi> 6 tests out of how many
23:37:51 <int-e> 6
23:38:08 <EvanR> that means 5 tests passed, that's pretty good considering
23:38:09 <int-e> it stops at 100 tests
23:38:11 <DigitalKiwi> oh wait it found 1 after six tests
23:38:15 <DigitalKiwi> i thought it found six lol
23:38:48 <int-e> > 0.1 + (0.2 + 0.3) == (0.1 + 0.2) + 0.3
23:38:49 <lambdabot> False
23:38:50 <DigitalKiwi> so 5/6
23:39:24 <DigitalKiwi> > 5/6 > 2/3
23:39:25 <lambdabot> True
23:39:27 <EvanR> asking for software to work better than 5 in 6 is just entitlement
23:39:38 <int-e> ouch
23:39:39 <ddellacosta> that's what my LLM told me
23:39:47 <DigitalKiwi> EvanR: it's better than you thought!
23:39:51 <darkling> "Oh, that's nothing, says Man, who goes on to prove that black is white, and gets himself run over on the next zebra crossing"
23:39:52 <int-e> EvanR: so you own a Tesla
23:39:58 <EvanR> lol
23:40:30 <DigitalKiwi> saw a torched car driving my pax on the interstate and said "huh that doesn't look like a tesla"
23:40:31 <ddellacosta> darkling, lovely Douglas Adams quote
23:40:35 <geekosaur> you don't even need a Tesla for that
23:41:04 <darkling> ddellacosta: I justfinished reading The Salmon of Doubt. :)
23:41:10 × fweht quits (uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity)
23:41:15 <geekosaur> cars have been capable of bluescreening on you for a couple decades
23:41:56 <geekosaur> tesla just failed to learn the lessons every other car manufacturer did the hard way
23:42:16 <darkling> s/failed to learn/deliberately ignored/
23:43:53 sagax joins (~sagax_nb@user/sagax)
23:46:54 × gurkenglas quits (~gurkengla@dynamic-046-114-176-237.46.114.pool.telefonica.de) (Ping timeout: 246 seconds)
23:50:00 × Tuplanolla quits (~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Quit: Leaving.)
23:51:03 mauke_ joins (~mauke@user/mauke)
23:52:38 × mauke quits (~mauke@user/mauke) (Ping timeout: 246 seconds)
23:52:38 mauke_ is now known as mauke
23:55:52 wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com)
23:55:53 × wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
23:55:53 wroathe joins (~wroathe@user/wroathe)

All times are in UTC on 2023-07-07.