2023/08/21

2023-08-21 00:04:39 +0200jero98772(~jero98772@2800:484:1d84:300::2)
2023-08-21 00:05:42 +0200stiell_(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 246 seconds)
2023-08-21 00:07:30 +0200Pickchea(~private@user/pickchea) (Quit: Leaving)
2023-08-21 00:07:47 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 00:08:15 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au)
2023-08-21 00:08:15 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au) (Changing host)
2023-08-21 00:08:15 +0200dibblego(~dibblego@haskell/developer/dibblego)
2023-08-21 00:08:20 +0200stiell_(~stiell@gateway/tor-sasl/stiell)
2023-08-21 00:09:11 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 00:09:11 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 00:11:37 +0200jero98772(~jero98772@2800:484:1d84:300::2) (Ping timeout: 260 seconds)
2023-08-21 00:12:47 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 260 seconds)
2023-08-21 00:14:53 +0200caryhartline(~caryhartl@168.182.58.169)
2023-08-21 00:19:10 +0200mikoto-chan(~mikoto-ch@85-76-46-81-nat.elisa-mobile.fi)
2023-08-21 00:25:35 +0200mvk(~mvk@2607:fea8:5c9a:a600::1c6d)
2023-08-21 00:26:26 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2023-08-21 00:29:08 +0200tremon(~tremon@83.80.159.219) (Quit: getting boxed in)
2023-08-21 00:32:47 +0200fweht(uid404746@id-404746.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2023-08-21 00:46:20 +0200mikoto-chan(~mikoto-ch@85-76-46-81-nat.elisa-mobile.fi) (Ping timeout: 245 seconds)
2023-08-21 00:49:20 +0200 <wroathe> Hey guys, so I've got a memory profile of my program that shows that lots of Text and ARR_WORDS are being allocated by my program. I think I know where this is happening, but what tools can I use to very clearly see the new allocation being made with my own two eyes?
2023-08-21 00:49:47 +0200 <wroathe> I'm calling `drop` from Data.Text, and from what I can see in the text library code it looks like it creates a new Text object
2023-08-21 00:50:05 +0200 <wroathe> What I'm wondering is if this strict annotation here: https://github.com/haskell/text/blob/master/src/Data/Text/Internal.hs#L66 means that it copies the inner array each time it does so?
2023-08-21 00:50:24 +0200hsxtrt(~hsxtrt@14-200-253-168.static.tpgi.com.au)
2023-08-21 00:50:32 +0200 <wroathe> Here's where a new Text is created: https://github.com/haskell/text/blob/master/src/Data/Text.hs#L1450
2023-08-21 00:51:16 +0200 <wroathe> Is there a compilation stage I can look at that would show me that calling drop is copying this array?
2023-08-21 00:51:21 +0200anselmschueler(~anselmsch@user/schuelermine) (Quit: WeeChat 4.0.3)
2023-08-21 00:51:52 +0200 <mauke> to me that looks like it creates a new wrapper object (of type Text), but does not copy the underlying array
2023-08-21 00:52:16 +0200 <wroathe> Ah. I was wondering if the ! would change that behavior
2023-08-21 00:52:28 +0200 <geekosaur> nope, it requires more than that
2023-08-21 00:53:54 +0200 <wroathe> Hmm, this is the section of code I'm trying to figure out the problem with: https://gist.github.com/JustinChristensen/1a260e17984f0daae853fc5d56ab08f5
2023-08-21 00:54:13 +0200 <wroathe> From earlier this morning. The profile says that this advanceTo routine is responsible for 33% of my program's allocations
2023-08-21 00:54:46 +0200 <wroathe> The idea there is with megaparsec I'm trying to advance the input and offset to a TSV field boundary (and hoping to do that without any extra allocations)
2023-08-21 00:55:17 +0200 <wroathe> Sorry, 37%
2023-08-21 00:56:55 +0200jargon(~jargon@174-22-213-62.phnx.qwest.net)
2023-08-21 00:57:28 +0200 <EvanR> so how does findIndex work
2023-08-21 00:58:35 +0200 <EvanR> i'll be interested to see how you do that without allocations
2023-08-21 00:59:20 +0200 <wroathe> https://github.com/haskell/text/blob/9fc523cef77f02c465afe00a2f4ac67c388f9945/src/Data/Text.hs#L19…
2023-08-21 00:59:37 +0200 <EvanR> ah it's from Data.Text
2023-08-21 01:00:19 +0200 <wroathe> EvanR: Yeah, I don't truly mean zero allocation. I'm just trying to approximate how easy it woudl be to do something like this with an array in C to this context
2023-08-21 01:00:23 +0200hsxtrt(~hsxtrt@14-200-253-168.static.tpgi.com.au) (Quit: This computer has gone to sleep)
2023-08-21 01:00:55 +0200 <wroathe> The -hd profile I just ran shows Text and ARR_WORDS is the largest portion of allocation occuring
2023-08-21 01:01:33 +0200 <EvanR> the Data.Text implementation code uses a stream framework which is subject to optimizations, like fusion
2023-08-21 01:01:59 +0200Guest|7(~Guest|7@cpe-184-54-115-255.swo.res.rr.com)
2023-08-21 01:02:08 +0200 <EvanR> you said you were reading 8MB file, so there's that
2023-08-21 01:02:47 +0200 <wroathe> Yup
2023-08-21 01:03:02 +0200 <wroathe> I'm trying to figure out how to get a screenshot of this report. One sec.
2023-08-21 01:03:25 +0200 <EvanR> is it lazy I/O or fully loaded before parsing
2023-08-21 01:03:34 +0200 <Guest|7> Hello! I'm trying to install GHCi on Artix linux. I saw the section about setting a platform-override for ghcup, but I can't find what the config overrides would be for Arch. Would anyone be able to tell me what command I should use?
2023-08-21 01:04:08 +0200 <wroathe> EvanR: I'm just using Data.Text.IO readFile
2023-08-21 01:04:09 +0200 <EvanR> if it's lazy I/O it's not surprising to see alot of allocating in the process of seeking forward
2023-08-21 01:05:05 +0200 <shapr> there's a lot to learn in the world
2023-08-21 01:05:39 +0200 <shapr> Guest|7: What's different about artix linux? What's a platform override?
2023-08-21 01:07:18 +0200 <Guest|7> The issue is that when running `ghcup install ghci`, ghcup throws an error about 'undetected distro'. Arch and Artix are pretty similar, Artix just has more options for init systems. I got the platform override from here: https://www.haskell.org/ghcup/guide/#overriding-distro-detection
2023-08-21 01:07:44 +0200 <Guest|7> But it only lists an example for Void and Ubuntu
2023-08-21 01:09:35 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2023-08-21 01:10:10 +0200 <EvanR> wroathe, according to readFile (hGetContents) for Data.Text.IO, it will read chunks until none are left to read, concat them all and return them. So that's a lot of allocating, but should happen upfront at the beginning
2023-08-21 01:11:07 +0200 <sclv> Guest|7: you can find a list of the platforms in the ghcup distro metadata yaml i think https://github.com/haskell/ghcup-metadata/blob/c88802ea8cf25a4e16227679dd89e8843ad7f759/ghcup-0.0.…
2023-08-21 01:11:55 +0200 <Guest|7> Oh I see, thanks. I was just looking in the wrong place
2023-08-21 01:12:05 +0200 <wroathe> EvanR: https://i.imgur.com/aETjZ8g.png
2023-08-21 01:12:22 +0200 <wroathe> The amount of technical difficulty I had getting that screenshot on desktop linux makes me feel old :D
2023-08-21 01:12:41 +0200 <EvanR> print screen works on default ubuntu right now
2023-08-21 01:12:50 +0200 <wroathe> Yeah I'm on Fedora, and relatively new to it
2023-08-21 01:12:54 +0200 <shapr> ( flameshot is a really good screenshot tool on Linux, according to my recent research )
2023-08-21 01:12:55 +0200 <wroathe> I'm just getting used to grim/slurp
2023-08-21 01:13:00 +0200 <wroathe> Using sway as my window manager
2023-08-21 01:13:23 +0200 <wroathe> Yeah I just installed/used grimshot and it did what I needed
2023-08-21 01:13:38 +0200 <wroathe> This is the result of running with -hd for my program: https://i.imgur.com/aETjZ8g.png
2023-08-21 01:13:53 +0200 <EvanR> if you're expecting your program to be able to process everything in a fixed amount of memory, then your picture shows a space leak
2023-08-21 01:14:17 +0200 <wroathe> Yeah, I gathered that much already
2023-08-21 01:14:55 +0200 <wroathe> I don't think "fixed", but at the very least my goal is for something like advanceTo to not cost me 37% of my memory usage
2023-08-21 01:14:57 +0200 <EvanR> I still wasn't sure if you were chasing something worth chasing xD
2023-08-21 01:15:07 +0200 <shapr> Guest|7: did it work?
2023-08-21 01:15:16 +0200 <Guest|7> not yet
2023-08-21 01:15:45 +0200 <wroathe> Because again mentally I'm trying to implement "advance the pointer, subtract the difference to get the offset added, commit those to the parser state"
2023-08-21 01:15:56 +0200 <probie> wroathe: do you get different results for memory usage when there's no lazy IO going on?
2023-08-21 01:16:00 +0200 <wroathe> Which might not be possible with megaparsec, but I'm just seeing what options I've got
2023-08-21 01:16:16 +0200 <wroathe> probie: How would I disable that? Which Data.Text routine are you thinking?
2023-08-21 01:16:31 +0200 <EvanR> megaparsec does backtracking, so it might not be able to drop context it needs to possibly backtrack if there's a parse error some time before the end of the processing
2023-08-21 01:17:03 +0200 <wroathe> EvanR: Well that's fine. In this mental model I'm describing there could be many parser states. As long as we're talking about pointers and not entirely new arrays the amount of overhead should be minimal
2023-08-21 01:17:23 +0200 <wroathe> (sorry I know I'm trying to apply C understanding to an entirely different beast. try to bear with me)
2023-08-21 01:17:41 +0200 <EvanR> your picture, it shows a fixed amount of ARR_WORDS
2023-08-21 01:17:49 +0200 <EvanR> which is good
2023-08-21 01:18:25 +0200 <EvanR> Text and the thing under ARR_WORDS is growing
2023-08-21 01:18:35 +0200 <EvanR> along with a lot of other stuff
2023-08-21 01:18:58 +0200 <EvanR> it looks like the ARR_WORDS grows to its max in the first 0.1 seconds, probably loading the file
2023-08-21 01:19:30 +0200 <probie> wroathe: ignore me, for some reason I thought `Data.Text.readFile` was lazy, but it's not
2023-08-21 01:19:39 +0200dolio(~dolio@130.44.134.54) (Quit: ZNC 1.8.2 - https://znc.in)
2023-08-21 01:19:46 +0200 <EvanR> yeah
2023-08-21 01:19:51 +0200 <wroathe> Here's the full program: https://gist.github.com/JustinChristensen/72e4eae8a8e6e4e4f9be09078770c504
2023-08-21 01:21:00 +0200dolio(~dolio@130.44.134.54)
2023-08-21 01:21:15 +0200jero98772(~jero98772@2800:484:1d84:300::2)
2023-08-21 01:23:07 +0200shapr(~user@2600:1700:c640:3100:5507:bbc0:d0c9:b395) (Remote host closed the connection)
2023-08-21 01:23:21 +0200shapr(~user@2600:1700:c640:3100:6898:ed8d:7f5e:e726)
2023-08-21 01:23:41 +0200 <EvanR> on line 278 and 279 you're holding some strings (Text) while you recurse deeper into the parsing
2023-08-21 01:23:52 +0200 <EvanR> finally it will all be linked into a list and returned
2023-08-21 01:24:04 +0200mikoto-chan(~mikoto-ch@85-76-46-81-nat.elisa-mobile.fi)
2023-08-21 01:24:06 +0200 <EvanR> so it makes sense your Text constructors will steadily increase
2023-08-21 01:24:20 +0200 <wroathe> Yeah I was wondering about that
2023-08-21 01:24:31 +0200 <wroathe> But the confusing thing is that profiling is telling me that advanceTo is the problem
2023-08-21 01:24:59 +0200 <EvanR> still not sure there is a problem yet
2023-08-21 01:25:19 +0200Guest|7(~Guest|7@cpe-184-54-115-255.swo.res.rr.com) (Quit: Connection closed)
2023-08-21 01:25:40 +0200 <wroathe> I just added the full profile
2023-08-21 01:25:41 +0200 <wroathe> To that gist
2023-08-21 01:25:48 +0200 <wroathe> If you refresh
2023-08-21 01:25:54 +0200 <EvanR> other than the obvious, you will wait until the end of parsing to return a giant linked list of strings
2023-08-21 01:26:10 +0200 <wroathe> yeah, I expect that much
2023-08-21 01:26:23 +0200 <EvanR> but since we don't know if parsing failed until we finish, we can't start process that list lazily with this plan
2023-08-21 01:26:24 +0200 <wroathe> I'm just not expecting advanceTo to be responsible for 37% of allocations
2023-08-21 01:27:07 +0200 <EvanR> well the code for findIndex does a bunch of stuff
2023-08-21 01:27:22 +0200 <wroathe> So maybe that's the cost...
2023-08-21 01:27:28 +0200 <wroathe> Hmm, I guessed it would've been drop
2023-08-21 01:27:32 +0200 <EvanR> if it produces temporary constructors, they will be collected soon
2023-08-21 01:27:48 +0200dolio(~dolio@130.44.134.54) (Quit: ZNC 1.8.2 - https://znc.in)
2023-08-21 01:28:58 +0200 <EvanR> can you write a faster processor for this data, probably xD
2023-08-21 01:29:31 +0200 <EvanR> maybe using pipes or conduit
2023-08-21 01:29:48 +0200 <wroathe> faster in what sense?
2023-08-21 01:30:00 +0200xff0x(~xff0x@138.64.86.45) (Quit: xff0x)
2023-08-21 01:30:01 +0200 <wroathe> I'm fine with it buffering up my objects for the parse in memory
2023-08-21 01:30:33 +0200 <wroathe> The way I've written it it should only examine each line of the file twice
2023-08-21 01:30:35 +0200 <EvanR> fast runtime, less memory usage
2023-08-21 01:31:28 +0200 <wroathe> Well, what's slow about this? (I'm just trying to understand what you see as costly here)
2023-08-21 01:31:28 +0200caryhartline(~caryhartl@168.182.58.169) (Quit: caryhartline)
2023-08-21 01:31:36 +0200xff0x(~xff0x@2405:6580:b080:900:9c64:3e23:a36:74a0)
2023-08-21 01:31:58 +0200 <EvanR> depends on what the goal is. To produce a giant list of strings in memory and then end the program?
2023-08-21 01:32:27 +0200 <wroathe> EvanR: Haha, to insert into a database. I just haven't gotten that far yet.
2023-08-21 01:32:43 +0200 <wroathe> I'm trying to get the parser perfect first, and then I'll write the "insert into my database" co de
2023-08-21 01:32:46 +0200 <wroathe> code*
2023-08-21 01:33:16 +0200 <EvanR> if you change it slightly to "insert every valid line (record) into the database" you could go much faster
2023-08-21 01:33:54 +0200 <wroathe> That typically runs contradictory to everything I know about program speed :P I/O is expensive. It's much cheaper to buffer all of this up and then do large inserts
2023-08-21 01:34:05 +0200 <wroathe> s/cheaper/faster/
2023-08-21 01:34:51 +0200 <wroathe> I'm just trying to get rid of unnecessary allocations. I'm pretty happy with what's there so far besides strange results I'm seeing
2023-08-21 01:35:53 +0200 <EvanR> when you read a file incrementally, it's buffered for you
2023-08-21 01:36:18 +0200 <wroathe> I mean buffer the objects up that I'm then serializing into INSERT statements
2023-08-21 01:36:44 +0200 <wroathe> Incremental I/O wouldn't help here. I think we might be saying the same thing
2023-08-21 01:36:51 +0200razetime(~quassel@117.254.37.152)
2023-08-21 01:37:08 +0200 <EvanR> yeah, you can have a pipeline stage that chunks valid records if you want to put them all in one sql call
2023-08-21 01:37:30 +0200 <wroathe> How is that different than what I'm doing here? It seems to me that the difference there is just the API
2023-08-21 01:37:43 +0200 <EvanR> I just see a profile that grows to 100M before doing anything as possibly going faster, since having large heap footprint slows haskell down
2023-08-21 01:38:13 +0200 <wroathe> I'm 1. Reading the entire file into memory, 2. Parsing its contents into records in memory, and then I'll be 3. Serializing those objects into large INSERT statements
2023-08-21 01:38:46 +0200dolio(~dolio@130.44.134.54)
2023-08-21 01:38:50 +0200 <EvanR> yeah, that's chunk size = everything
2023-08-21 01:39:21 +0200 <wroathe> It just seems strange that an 8MB file would result in 100MB of resident heap size for this
2023-08-21 01:39:36 +0200 <wroathe> For a comparable C program I'd be surprised if I went over 20MB in total
2023-08-21 01:39:44 +0200 <EvanR> depends on how large your string slices into the file are
2023-08-21 01:39:46 +0200 <wroathe> For both the file in memory and my allocated structs
2023-08-21 01:40:02 +0200 <EvanR> if each string is 1 character, 8 -> 100 would be lucky xD
2023-08-21 01:40:11 +0200hsxtrt(~hsxtrt@14-200-253-168.static.tpgi.com.au)
2023-08-21 01:40:19 +0200 <wroathe> Yeah I think that's the rub
2023-08-21 01:40:20 +0200 <EvanR> a Text has non trivial overhead
2023-08-21 01:40:32 +0200 <EvanR> at least it's not 1 character
2023-08-21 01:40:59 +0200 <EvanR> this is another reason you'd like to not load it all into memory at once
2023-08-21 01:41:07 +0200 <wroathe> Hmm, I wonder if Bytestring or String would lead to better memory usage
2023-08-21 01:41:20 +0200 <monochrom> Did you know that a list of length n takes 3*w*n bytes where w=4 or 8, and this is just for the (:) nodes, not even counting the elements?
2023-08-21 01:41:21 +0200 <geekosaur> String will be much worse
2023-08-21 01:41:21 +0200 <EvanR> not String, no which has that overhead for every single Char
2023-08-21 01:41:39 +0200Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 246 seconds)
2023-08-21 01:42:03 +0200 <monochrom> And the heap size is going to be 2*3*w*n because copying GC = double buffering like in computer graphics.
2023-08-21 01:42:29 +0200 <wroathe> monochrom: where are you getting the 3 from?
2023-08-21 01:42:44 +0200 <monochrom> How GHC does algebraic data types.
2023-08-21 01:43:05 +0200xff0x(~xff0x@2405:6580:b080:900:9c64:3e23:a36:74a0) (Quit: xff0x)
2023-08-21 01:43:13 +0200 <wroathe> Hmm, let me get the final list counts
2023-08-21 01:43:38 +0200 <monochrom> A white-lie model that gives the correct answer but white-lie reason: each data constructor takes w bytes, each field is a pointer that also takes w bytes.
2023-08-21 01:43:49 +0200 <wroathe> Oh shoot I'm about to be kicked out of this coffee shop. I'll be back on in a bit
2023-08-21 01:43:50 +0200 <EvanR> the list nodes don't even show up in your profile because that's at the last moment before the program ends (without using the list)
2023-08-21 01:43:51 +0200 <monochrom> (:) has 2 fields therefore (1+2)*w bytes.
2023-08-21 01:43:54 +0200caryhartline(~caryhartl@168.182.58.169)
2023-08-21 01:44:17 +0200 <EvanR> profile after you print out the number of list nodes xD
2023-08-21 01:44:33 +0200 <wroathe> EvanR: Yeah that adds even more. I've tested that.
2023-08-21 01:45:00 +0200 <monochrom> The white lie is in "data constructor takes w bytes". In truth, it is a pointer to a chunk of code and info that represents the data constructor.
2023-08-21 01:45:03 +0200 <EvanR> list is better used as a vehicle for lazy evaluation than a large data structure :tm:
2023-08-21 01:46:03 +0200Lord_of_Life(~Lord@user/lord-of-life/x-2819915)
2023-08-21 01:47:04 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 01:47:32 +0200 <hpc> it's perhaps better to call it a control structure than a data structure
2023-08-21 01:47:54 +0200 <EvanR> Control.List
2023-08-21 01:47:56 +0200 <hpc> it's a loop in disguise, kind of like how a tree is a search in disguise
2023-08-21 01:47:57 +0200 <EvanR> Data.Monad
2023-08-21 01:48:17 +0200 <mauke> Data.Function
2023-08-21 01:48:24 +0200 <EvanR> Function.Data
2023-08-21 01:48:52 +0200wroathe(~wroathe@user/wroathe) (Ping timeout: 250 seconds)
2023-08-21 01:48:56 +0200 <hpc> in other languages they still talk about say, alpha-beta search as a "search tree" rather than "this funny sort of recursive function call"
2023-08-21 01:49:07 +0200 <monochrom> Basically people who are short on RAM know about the life hack that you can reduce space consumption by 50% just by switching back to 32-bit GHC.
2023-08-21 01:49:08 +0200 <int-e> wroathe: Hmm, can you try making `i` strict in this line? https://gist.github.com/JustinChristensen/72e4eae8a8e6e4e4f9be09078770c504#file-parse-hs-L161 (so either with a bang pattern, (!i, "") or with i `seq` on the RHS)
2023-08-21 01:49:35 +0200 <EvanR> they left
2023-08-21 01:49:35 +0200 <hpc> the tree never materializes, unless you consider those function definitions a hard-coded version of it
2023-08-21 01:49:42 +0200 <int-e> https://hackage.haskell.org/package/text-2.0.2/docs/src/Data.Text.Read.html#decimal looks like it'll leave an unevaluated `foldl'` around
2023-08-21 01:49:45 +0200 <int-e> EvanR: oh, unlucky
2023-08-21 01:50:18 +0200 <geekosaur> "I'll be back on in a bit"
2023-08-21 01:50:28 +0200 <geekosaur> think they're looking for another open coffeeshop 🙂
2023-08-21 01:50:33 +0200 <EvanR> ^
2023-08-21 01:50:35 +0200 <hpc> monochrom: from a certain perspective, they're reducing space consumption by a factor of 4 billion :D
2023-08-21 01:50:43 +0200 <int-e> Which maybe explains the odd Data.Text.Read.sat_s1Vc6 allocations *and* will also hang onto a bunch of `Text` data. (looking at https://i.imgur.com/aETjZ8g.png )
2023-08-21 01:51:02 +0200 <int-e> (I'd probably forget if I didn't finish that thought.)
2023-08-21 01:51:15 +0200mvk(~mvk@2607:fea8:5c9a:a600::1c6d) (Ping timeout: 246 seconds)
2023-08-21 01:51:22 +0200 <hpc> (actually more than that, exponentials are ridiculous)
2023-08-21 01:51:28 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
2023-08-21 01:51:40 +0200falafel(~falafel@51.6.68.216) (Ping timeout: 248 seconds)
2023-08-21 01:52:10 +0200 <monochrom> Sunday evening anything open late is going to be tough.
2023-08-21 01:52:33 +0200 <int-e> EvanR: "unlucky" - I used tab-completion to write that nick
2023-08-21 01:52:52 +0200 <int-e> but didn't check again when I had finished typing the message
2023-08-21 01:53:32 +0200 <EvanR> libera haskell IRC perpetual blinking neon sign that says OPEN
2023-08-21 01:53:58 +0200 <EvanR> ok maybe not blinking that would drive me nuts
2023-08-21 01:54:55 +0200 <monochrom> Some neon signs blink because of malfunction and old age. We're in good hands. >:)
2023-08-21 01:55:43 +0200 <EvanR> yeah not blinking VCR 12:00, but stochastic
2023-08-21 01:57:46 +0200 <monochrom> I feel that we are just confronting the well-understood "parsing with `many foo` takes linear space and the constant multiplier is huge too".
2023-08-21 01:58:55 +0200 <int-e> monochrom: I mostly agree. I just didn't understand that one particular allocation.
2023-08-21 02:00:51 +0200 <monochrom> This year I didn't teach Functor-Applicative-Monad. But I thought up a good exam question a while ago before I made that decision.
2023-08-21 02:01:24 +0200 <monochrom> One can prove from the Applicative laws that `liftA2 (&&)` must not do short-circuiting.
2023-08-21 02:02:00 +0200wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2023-08-21 02:02:00 +0200wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2023-08-21 02:02:00 +0200wroathe(~wroathe@user/wroathe)
2023-08-21 02:02:06 +0200califax(~califax@user/califx) (Remote host closed the connection)
2023-08-21 02:02:14 +0200 <wroathe> Back. Sorry. Damn public places and their so-called "hours of operation"
2023-08-21 02:03:27 +0200 <EvanR> you missed some stuff https://ircbrowse.tomsmeding.com/browse/lchaskell?id=1055666#trid1055666
2023-08-21 02:03:28 +0200 <int-e> wroathe: http://paste.debian.net/1289541/
2023-08-21 02:03:41 +0200 <int-e> hah, redundant again
2023-08-21 02:04:34 +0200 <wroathe> int-e: EvanR: thanks
2023-08-21 02:04:34 +0200califax(~califax@user/califx)
2023-08-21 02:04:39 +0200 <monochrom> Actually more essentially and easily, `fmap (False &&) foo` cannot short-ciruit to pure False.
2023-08-21 02:05:20 +0200 <int-e> > liftA2 (&&) (pure False) (pure undefined)
2023-08-21 02:05:21 +0200 <lambdabot> error:
2023-08-21 02:05:21 +0200 <lambdabot> • Ambiguous type variable ‘f0’ arising from a use of ‘show_M661397343980...
2023-08-21 02:05:21 +0200 <lambdabot> prevents the constraint ‘(Show (f0 Bool))’ from being solved.
2023-08-21 02:05:28 +0200 <int-e> > liftA2 (&&) (pure False) (pure undefined) :: [Bool]
2023-08-21 02:05:29 +0200 <lambdabot> [False]
2023-08-21 02:05:53 +0200 <monochrom> pure undefined /= undefined
2023-08-21 02:06:15 +0200xff0x(~xff0x@2405:6580:b080:900:9c64:3e23:a36:74a0)
2023-08-21 02:06:15 +0200 <int-e> monochrom: sure, I know what you're after, but I couldn't help pointing out that the short-cutting of && is still there
2023-08-21 02:06:57 +0200 <wroathe> Haha, I wasn't looking for another coffee shop. I decided to head home. They can't kick me out of my home (at least I don't think...)
2023-08-21 02:07:32 +0200 <int-e> this is pretty much the dividing line between applicatives and monads... with moands, you *can* short-circuit on the monad action level.
2023-08-21 02:08:05 +0200 <wroathe> int-e: EvanR: so what's the takeaway from that backscroll? int-e is that line you highlighted a major source of my allocation troublle?
2023-08-21 02:08:06 +0200 <int-e> "Computations depending on wrapped values" if you will. Which is really the essence of bind.
2023-08-21 02:08:45 +0200 <int-e> wroathe: I don't know... I didn't run any code. It /might/ be good for reducing allocations by 10-15%.
2023-08-21 02:09:08 +0200 <EvanR> it was something to try
2023-08-21 02:09:21 +0200 <EvanR> maybe a magic single ! that improves performance
2023-08-21 02:10:14 +0200 <int-e> wroathe: TBH I'm mostly questioning your approach... why would you go through the file in one go instead of using smaller chunks. But I got curious about that one allocation item.
2023-08-21 02:10:55 +0200 <wroathe> I'm gathering the haskell GC makes processing in smaller chunks advantageous, but conventional wisdom with other runtimes is that this is the better approach
2023-08-21 02:11:24 +0200 <wroathe> In general I don't care if this takes memory. I just don't want it to be taking memory that it doesn't need to.
2023-08-21 02:11:30 +0200 <int-e> sorry, not allocations
2023-08-21 02:11:34 +0200 <int-e> I mean resident size
2023-08-21 02:12:19 +0200hsxtrt(~hsxtrt@14-200-253-168.static.tpgi.com.au) (Quit: This computer has gone to sleep)
2023-08-21 02:12:57 +0200jero98772(~jero98772@2800:484:1d84:300::2) (Ping timeout: 260 seconds)
2023-08-21 02:13:24 +0200 <EvanR> 2 seconds is a really long time for that size of file. It's great that it works, but if we really don't care about performance, why all the hacking of parser state
2023-08-21 02:13:26 +0200 <wroathe> monochrom: So in total this results in 30209 "company" objects, 90627 "address" objects, and 30209 "submission" objects after parsing this file
2023-08-21 02:14:30 +0200 <wroathe> EvanR: Because the hacking of parser state is supposed to be a performance improvement. The point there is that I'm trying to remember field positions to allow for random access to give myself the freedom to parse a given row into multiple objects in a random access pattern like parseSubmission does
2023-08-21 02:14:43 +0200 <EvanR> I presumed you wanted high performance, like, does all this in like 2 milliseconds xD
2023-08-21 02:14:56 +0200 <wroathe> I'm quite happy with that API for what I'm doing. The advancing of the parser from one field separation to the next should in theory be "free"
2023-08-21 02:15:02 +0200 <wroathe> But this profile says it's 37% of my allocations
2023-08-21 02:15:14 +0200 <int-e> Nobody has said "premature optimization" yet... this really feels like one.
2023-08-21 02:15:16 +0200 <wroathe> EvanR: If I wanted that high of performance I'd just do this in C
2023-08-21 02:15:17 +0200hsxtrt(~hsxtrt@14-200-253-168.static.tpgi.com.au)
2023-08-21 02:15:24 +0200 <EvanR> no.
2023-08-21 02:15:26 +0200 <wroathe> int-e: It's a hobby program. If this were for work I'd agree with you
2023-08-21 02:15:35 +0200 <geekosaur> flatparse
2023-08-21 02:15:45 +0200 <EvanR> I think a point is being missed here about how haskell can be really fast, esp at simple stuff like this
2023-08-21 02:15:51 +0200 <wroathe> But since I'm doing this for fun I'm free to quibble about memory use and performance all I want :D
2023-08-21 02:15:55 +0200 <EvanR> but you're slow and complicated right now
2023-08-21 02:16:41 +0200 <wroathe> So the key to a fast haskell program is to find out what the perfect max residency size is to manipulate the GC into being performant?
2023-08-21 02:16:59 +0200 <wroathe> Or what's the fundamental difference here between my "slow and complicated" approach, and what I should be doing?
2023-08-21 02:17:18 +0200 <EvanR> I'm just saying it would be slow and simple by using megaparsec normally
2023-08-21 02:17:32 +0200 <int-e> geekosaur: argh, why is `char :: Char -> Q Exp`
2023-08-21 02:17:34 +0200 <EvanR> less code I believ
2023-08-21 02:18:55 +0200 <wroathe> EvanR: I'm not understanding how this isn't a normal use of megaparsec. There's nothing in the API documentation that says I'm not allowed to manipulate the parser state. In fact, he provides an API to do just that
2023-08-21 02:18:56 +0200 <EvanR> (maybe it would actually improve performance not trying to preempt the parser and search the string yourself)
2023-08-21 02:19:00 +0200 <int-e> It's mostly fine; I just didn't expect to see Template Haskell in the API.
2023-08-21 02:19:02 +0200logothesia(~logothesi@user/logothesia) (Ping timeout: 256 seconds)
2023-08-21 02:19:32 +0200 <EvanR> well you search but also use combinators like manyTill
2023-08-21 02:19:36 +0200 <wroathe> The reason I'm doing it this way is so I get nice parse errors as I'm trying to randomly access the current parsed row
2023-08-21 02:20:09 +0200 <EvanR> fair enough
2023-08-21 02:20:15 +0200 <wroathe> If I were to just read the current row into a [Text] I'd be able to do the random access thing, but the parse errors would suck
2023-08-21 02:20:29 +0200 <EvanR> sure
2023-08-21 02:20:52 +0200 <wroathe> And in that circumstance I'd be skeptical that I'm doing anything fundamentally different than what I'm doing now
2023-08-21 02:21:19 +0200 <wroathe> Because ultimately `drop` and takeWhileP would end up resulting in a new Text being created
2023-08-21 02:21:58 +0200 <EvanR> drop obviously creates a new Text, but it just points into the existing underlying array, which is great
2023-08-21 02:22:35 +0200 <wroathe> Also another thing that's weird about this...
2023-08-21 02:23:02 +0200ystael(~ystael@user/ystael) (Ping timeout: 252 seconds)
2023-08-21 02:23:04 +0200 <wroathe> Say what you will about the "random access" to a row's fields thing I'm trying to do, but advanceTo is only being called proportional to the number of fields in the underlying TSV file
2023-08-21 02:23:11 +0200 <geekosaur> int-e, it looks like they generate parsers for literals at compile time for speed
2023-08-21 02:23:14 +0200 <wroathe> That is, it should only be called once per \t or \n
2023-08-21 02:23:25 +0200 <EvanR> you also need to be careful about attributing "allocations" to particular functions
2023-08-21 02:23:40 +0200 <geekosaur> everything leads to https://hackage.haskell.org/package/flatparse-0.5.0.1/docs/src/FlatParse.Basic.Bytes.html#bytesUns…
2023-08-21 02:23:43 +0200 <wroathe> Yeah I'm just going off of what that profile says.
2023-08-21 02:23:45 +0200 <EvanR> I'm not sure how meaningful the profile is on that, since stuff happens at lazy times
2023-08-21 02:24:07 +0200 <wroathe> geekosaur: Haha, is this how I make a fast haskell parser? :)
2023-08-21 02:24:22 +0200 <geekosaur> yes
2023-08-21 02:24:45 +0200 <wroathe> EvanR: well there I ahve it
2023-08-21 02:24:47 +0200 <int-e> beautiful
2023-08-21 02:24:47 +0200 <wroathe> have* it
2023-08-21 02:25:04 +0200 <wroathe> Idk these parser combinator libraries are pretty heavily marketed in the haskell space
2023-08-21 02:25:06 +0200 <int-e> (there's a blinking sarcasm tag after that)
2023-08-21 02:25:16 +0200 <EvanR> code that is located within some function lexically could be evaluated as part of some other thing because laziness
2023-08-21 02:25:26 +0200 <wroathe> It's as if Attoparsec, Parsec, and Megaparsec are the only way you're supposed to parse in a functional context
2023-08-21 02:25:44 +0200 <wroathe> Nevermind a good old fashioned stack and switch iterative parser
2023-08-21 02:26:03 +0200 <EvanR> those do represent the haskell version of recursive descent
2023-08-21 02:26:03 +0200 <geekosaur> happy exists, it's just slower than megaparsec or attoparsec
2023-08-21 02:26:14 +0200 <probie> Some people still use happy (the Haskell version of yacc/bison)
2023-08-21 02:26:47 +0200 <geekosaur> flatparse is quite new so hasn't got a lot of market share yet, but it's been catching on
2023-08-21 02:27:50 +0200bratwurst(~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8)
2023-08-21 02:28:16 +0200 <wroathe> Well thanks for the help guys (especially you, EvanR). I've got a lot to mull over here.
2023-08-21 02:28:39 +0200 <EvanR> wroathe, another avenue you might be barking down inappropriately, is the act of allocating is not as expensive as in C with malloc. Since the allocator is very simple (the GC does all the work later)
2023-08-21 02:29:32 +0200YuutaW(~YuutaW@mail.yuuta.moe) (Ping timeout: 245 seconds)
2023-08-21 02:29:35 +0200 <EvanR> so if some function really is doing 37% of the allocations, it might not be taking all the time
2023-08-21 02:29:48 +0200 <wroathe> EvanR: Yeah, but as you said, 2s is quite a long time. I've already made one performance improvement to this by fixing a place where I was using T.unpack to create small String objects whenever a field of my TSV held a time value I wanted to parse using parseTimeM from the time library
2023-08-21 02:29:58 +0200caryhartline(~caryhartl@168.182.58.169) (Quit: caryhartline)
2023-08-21 02:30:05 +0200 <wroathe> And it resulted in like a 30% reduction in allocations and an improvement of like 1.5 in running time
2023-08-21 02:30:23 +0200 <int-e> "Megaparsec [...] tries to find a nice balance between speed, flexibility, and quality of parse errors." -- reducing allocations doesn't even make the list
2023-08-21 02:30:26 +0200 <wroathe> So I figure if I can make one more big improvement like that I'll be cooking with fire
2023-08-21 02:30:47 +0200razetime(~quassel@117.254.37.152) (Ping timeout: 245 seconds)
2023-08-21 02:30:48 +0200 <EvanR> another metric to look at is how much time is spent in GC
2023-08-21 02:30:59 +0200 <EvanR> as a percent of runtime
2023-08-21 02:31:17 +0200int-eusually looks at residency and productivity
2023-08-21 02:31:31 +0200razetime(~quassel@117.254.36.54)
2023-08-21 02:32:12 +0200 <geekosaur> don't even need to profile for that, +RTS -s
2023-08-21 02:32:18 +0200YuutaW(~YuutaW@mail.yuuta.moe)
2023-08-21 02:32:23 +0200 <int-e> The amount of allocations matters, but temporary allocations are also the price of laziness. If I want full control over allocations I won't be using Haskell.
2023-08-21 02:32:47 +0200 <EvanR> you would use zig? xD
2023-08-21 02:33:09 +0200 <EvanR> comes with no less than 5 standard allocators
2023-08-21 02:34:14 +0200 <int-e> Rust or C or C++ most likely, in some order.
2023-08-21 02:34:48 +0200 <geekosaur> but if they're truly temporary allocations they cost ~nothing
2023-08-21 02:35:47 +0200 <wroathe> In a C context I'd mmap the file into memory, and then allocate a region for my objects. The string values would just be pointers into the original mmapped TSV file along with a length, or structs to hold the date objects or int for everything else
2023-08-21 02:35:51 +0200razetime(~quassel@117.254.36.54) (Ping timeout: 245 seconds)
2023-08-21 02:35:52 +0200 <EvanR> because they don't get traversed and then are lost all at once from the nursery
2023-08-21 02:36:13 +0200razetime(~quassel@117.254.37.27)
2023-08-21 02:36:27 +0200 <wroathe> All told like I said I'd be surprised if I went over 20MB residency for the whole parsed file with the structs
2023-08-21 02:36:33 +0200 <int-e> EvanR: yeah, it's cheap but it's not free (it comes at the cost of memory locality)
2023-08-21 02:39:41 +0200 <EvanR> I'm still curious about the possibly foldl' thunks corresponding to the 3rd thing in the profile, that might be eliminated with a single !, but meh
2023-08-21 02:40:16 +0200 <wroathe> I'll try int-e's suggestion in a bit here after I finish my dinner
2023-08-21 02:40:44 +0200bratwurst(~blaadsfa@2604:3d09:207f:f650:216:3eff:fe5a:a1f8) (Ping timeout: 248 seconds)
2023-08-21 02:43:04 +0200phma(~phma@host-67-44-208-38.hnremote.net) (Read error: Connection reset by peer)
2023-08-21 02:43:34 +0200phma(~phma@2001:5b0:2143:fba8:9b6b:196:6798:af5d)
2023-08-21 02:44:18 +0200mikoto-chan(~mikoto-ch@85-76-46-81-nat.elisa-mobile.fi) (Ping timeout: 246 seconds)
2023-08-21 02:45:24 +0200mvk(~mvk@2607:fea8:5c9a:a600::1c6d)
2023-08-21 02:45:54 +0200 <int-e> wroathe: Oh you also had that ghc-debug problem earlier... I think you have ghc < 9.4.2 but something in the build plan pulled in a later version of ghc-heap. (apparently ghc-heap-9.6.1 can be compiled on older ghc's, but does it actually work there?)
2023-08-21 02:49:14 +0200Tuplanolla(~Tuplanoll@91-159-68-236.elisa-laajakaista.fi) (Ping timeout: 244 seconds)
2023-08-21 02:49:38 +0200 <wroathe> int-e: 9.2.5. Good eye.
2023-08-21 02:49:42 +0200 <wroathe> I was wondering if that was the cause.
2023-08-21 02:51:11 +0200 <int-e> (I rather suspect that using a mismatched version of ghc-heap isn't okay... there's stuff in there that has to correspond directly with RTS internals like https://hackage.haskell.org/package/ghc-heap-9.6.1/docs/src/GHC.Exts.Heap.ClosureTypes.html )
2023-08-21 02:51:49 +0200 <wroathe> GHC releases new versions so quickly it's hard to keep up :P
2023-08-21 02:52:04 +0200 <int-e> and with the matching ghc-heap version you wouldn't run into this; compare https://gitlab.haskell.org/ghc/ghc-debug/-/blob/master/common/src/GHC/Debug/Decode/Convert.hs#L33-40
2023-08-21 02:52:14 +0200 <wroathe> And I only program in Haskell as a hobby, so it can be weeks or months at a time before I get back to little projects I'm working on
2023-08-21 02:52:29 +0200 <wroathe> int-e: Yeah, I was convinced when you initially said it
2023-08-21 02:52:38 +0200 <wroathe> I suspected that updating GHC would fix it when I posted the error earlier
2023-08-21 02:52:47 +0200 <wroathe> Although I didn't go into the detail you're going into to prove my assertion
2023-08-21 02:53:17 +0200 <int-e> wroathe: Yeah but I'm not saying that you should update GHC necessarily... at least at a glance, ghc-debug itself should be fine on older GHCs.
2023-08-21 02:53:40 +0200 <int-e> So I believe something else is pulling in a newer ghc-heap.
2023-08-21 02:55:15 +0200 <int-e> (And ideally, that package should have tighter dependencies so that this doesn't happen.)
2023-08-21 02:56:12 +0200 <wroathe> Well ghc-debug is still not fully baked
2023-08-21 02:56:23 +0200 <wroathe> It's only in version 0.5 at the moment
2023-08-21 02:57:24 +0200razetime(~quassel@117.254.37.27) (Ping timeout: 246 seconds)
2023-08-21 02:57:28 +0200 <int-e> hmm. I guess something like cabal install --constraint "ghc-heap=installed" would help to pinpoint the real culprit here. Assuming the installed version is the one bundled with the compiler.
2023-08-21 02:57:55 +0200razetime(~quassel@117.254.36.220)
2023-08-21 02:58:29 +0200azimut(~azimut@gateway/tor-sasl/azimut)
2023-08-21 02:58:56 +0200 <geekosaur> I think it's 'ghc-heap installed', not sure if the = works there
2023-08-21 02:59:06 +0200 <geekosaur> (double quotes also fine)
2023-08-21 02:59:06 +0200 <int-e> geekosaur: oh yes
2023-08-21 03:03:41 +0200szkl(uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity)
2023-08-21 03:06:39 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 03:06:40 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 03:10:35 +0200albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2023-08-21 03:12:37 +0200 <wroathe> int-e: Only slightly better. 83,266,260 versus 89,793,936
2023-08-21 03:12:45 +0200 <wroathe> with that bang pattern
2023-08-21 03:14:20 +0200 <EvanR> 17% less 🎉
2023-08-21 03:15:16 +0200 <EvanR> 7.2% less wow I can't use a calculator!
2023-08-21 03:15:22 +0200 <wroathe> I was going to say
2023-08-21 03:15:37 +0200 <wroathe> You had me in the middle of whipping out my own calculator :D
2023-08-21 03:15:56 +0200 <int-e> better than nothing. does it change the https://i.imgur.com/aETjZ8g.png graph? (hmm is that allocations or residency...)
2023-08-21 03:16:05 +0200 <EvanR> tada emoji somewhat rescinded
2023-08-21 03:16:21 +0200 <wroathe> cabal run tallow -O2 --enable-profiling -- data/2023q2/sub.txt +RTS -pa -L120 -hd
2023-08-21 03:16:33 +0200 <wroathe> int-e: it's the result of -hd, which I think is residency
2023-08-21 03:16:43 +0200albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2023-08-21 03:16:54 +0200 <wroathe> https://downloads.haskell.org/ghc/latest/docs/users_guide/profiling.html#rts-flag--hd
2023-08-21 03:17:32 +0200 <int-e> "live heap", yeah that's residency
2023-08-21 03:17:54 +0200quidnunc(~user@70.31.194.28) (Read error: Connection reset by peer)
2023-08-21 03:19:04 +0200 <wroathe> int-e: https://i.imgur.com/3WYdFMs.png
2023-08-21 03:20:15 +0200 <int-e> Cool, so the Data.Text.Read.sat* things are indeed gone. But it didn't reduce the Text numbers, hmm. Interesting.
2023-08-21 03:21:40 +0200 <int-e> (so that part of my speculation didn't work out)
2023-08-21 03:22:10 +0200 <EvanR> when you get individual text values in the recursive parser, I wonder if those are even evaluated fully before the list begins to materials
2023-08-21 03:22:12 +0200 <EvanR> materialize
2023-08-21 03:22:27 +0200 <EvanR> at the end of parsing
2023-08-21 03:23:14 +0200 <EvanR> assuming that's not them in the profile
2023-08-21 03:23:20 +0200 <EvanR> which I was assuming
2023-08-21 03:23:54 +0200 <int-e> Oh and of course the results have to go somewhere... is that the IS thing?
2023-08-21 03:25:14 +0200 <int-e> (Is that how I# is rendered in a profile?)
2023-08-21 03:28:52 +0200hsxtrt(~hsxtrt@14-200-253-168.static.tpgi.com.au) (Quit: This computer has gone to sleep)
2023-08-21 03:30:08 +0200mikoto-chan(~mikoto-ch@85-76-111-77-nat.elisa-mobile.fi)
2023-08-21 03:35:19 +0200 <int-e> Anyway, I think ultimately the data may just be roughly this big. For example, each `Maybe Text` that isn't Nothing takes up 48 bytes on the heap, in addition to 8 bytes in the corresponding record. (Assuming a 64 bit system), assuming they all point to the same underlying byte array.
2023-08-21 03:36:21 +0200 <wroathe> int-e: Could be, yeah. I'm just trying to beat this advanceTo thing to death
2023-08-21 03:36:22 +0200 <int-e> corresponding to the Text and Just constructors in that profile.
2023-08-21 03:36:36 +0200libertyprime(~libertypr@203.96.203.44)
2023-08-21 03:36:42 +0200 <wroathe> I'm about to run an experiment to isolate advanceTo here
2023-08-21 03:36:58 +0200 <int-e> I mean, there are a lot of sat_ there indicating that things are lazy that could be strict.
2023-08-21 03:37:45 +0200 <wroathe> ! all the things
2023-08-21 03:37:50 +0200 <int-e> But it's starting to look like you won't get below 60M with those data types, no matter how you do the parsing.
2023-08-21 03:38:27 +0200 <wroathe> int-e: Yup, I figured as much.
2023-08-21 03:38:50 +0200 <int-e> ("with those data types": it would be significantly more compact if you replaced each Maybe Text by an index and a length into the original input)
2023-08-21 03:38:52 +0200jle`(~jle`@23.240.75.236) (Ping timeout: 248 seconds)
2023-08-21 03:39:22 +0200 <int-e> If those are unpacked, that's 16 bytes instead of 48 + 8 bytes.
2023-08-21 03:39:43 +0200 <wroathe> Do you have some reading I can do on the representation of haskell data in memory?
2023-08-21 03:39:59 +0200 <wroathe> With C I can more or less add it all up in my head for my architecture, but for Haskell I've got no fucking clue
2023-08-21 03:40:16 +0200jle`(~jle`@cpe-23-240-75-236.socal.res.rr.com)
2023-08-21 03:42:11 +0200 <int-e> Well in the simplest case, it's one word for the constructor tag, and another word for each data item attached to it (a pointer). This is complicated when strict fields get unpacked... then rather than the pointer, you have the fields of the unpacked single-constructor type. And then you have primitive types which are usually a word, some sometimes more.
2023-08-21 03:43:50 +0200 <int-e> So Just x is 2 words, and Text happens to contain a ByteArray (which is a pointer to a heap object containing the actual byte array), and two unpacked Ints. So that's 4 words.
2023-08-21 03:44:15 +0200 <int-e> and 6 words = 48 bytes.
2023-08-21 03:46:16 +0200 <EvanR> why do you think there's a ton of Just hanging around
2023-08-21 03:46:18 +0200ddellacosta(~ddellacos@143.244.47.100) (Ping timeout: 256 seconds)
2023-08-21 03:46:46 +0200 <int-e> The details... there are papers on GHC's RTS, starting with the STG paper and many tweaks; not sure what the best one is. They talk about stuff like info tables (the tags are pointers to info tables), entry points (actually the tags are pointers to entry points and the info tables are put in front of those entry points)... lots of icky details.
2023-08-21 03:47:00 +0200 <wroathe> So I just ran an interesting experiment by just executing parseRowState in a loop
2023-08-21 03:47:11 +0200 <int-e> EvanR: Because basically every single text field is a Maybe Text.
2023-08-21 03:47:31 +0200 <int-e> EvanR: unless that was a rhetorical question; I can't tell.
2023-08-21 03:47:32 +0200 <EvanR> oh the Maybe is part of the output data
2023-08-21 03:47:55 +0200 <int-e> EvanR: https://gist.github.com/JustinChristensen/72e4eae8a8e6e4e4f9be09078770c504#file-parse-hs-L53-L58
2023-08-21 03:47:56 +0200 <EvanR> not a control structure
2023-08-21 03:48:09 +0200 <EvanR> ok then
2023-08-21 03:48:16 +0200ddellacosta(~ddellacos@146.70.168.217)
2023-08-21 03:48:48 +0200 <wroathe> int-e: EvanR: https://i.imgur.com/84es3Qe.png
2023-08-21 03:49:19 +0200 <EvanR> that's the same amount of ARR_WORDS as before, just not elevated on top of other stuff
2023-08-21 03:49:25 +0200 <EvanR> 8M of ARR_WORDS
2023-08-21 03:49:50 +0200 <wroathe> https://gist.github.com/JustinChristensen/72e4eae8a8e6e4e4f9be09078770c504#file-rowstate-hs
2023-08-21 03:49:50 +0200 <int-e> wroathe: expected... I mean if I understand correctly, you read the file and while all the stuff you have seen before gets allocated, it also gets collected quickly so it's lost in the noise
2023-08-21 03:49:51 +0200 <EvanR> basically the whole file
2023-08-21 03:49:58 +0200 <int-e> assuming you actually force the parse result
2023-08-21 03:50:10 +0200finsternis(~X@23.226.237.192) (Read error: Connection reset by peer)
2023-08-21 03:50:37 +0200 <int-e> the 3.5MB number looks like you're, maybe, not forcing the parse
2023-08-21 03:50:42 +0200hsxtrt(~hsxtrt@14.200.253.168)
2023-08-21 03:50:56 +0200 <wroathe> I linked the updated program there
2023-08-21 03:51:30 +0200 <EvanR> I change my earlier speculation about evaluating those individual Text to evaluating the Just text
2023-08-21 03:51:46 +0200 <EvanR> as soon as possible
2023-08-21 03:51:59 +0200 <wroathe> And here is the profile for that updated program: https://gist.github.com/JustinChristensen/72e4eae8a8e6e4e4f9be09078770c504#file-rowstate-prof
2023-08-21 03:52:12 +0200 <wroathe> So based on this what I think I'm getting is...
2023-08-21 03:52:20 +0200 <wroathe> Yeah, resident here there's only the 8MB worth of data from the file
2023-08-21 03:52:37 +0200 <wroathe> But during the course of execution advanceTo seems to be allocating lots of objects that get GCed immediately?
2023-08-21 03:53:36 +0200 <wroathe> I think it must be misreporting
2023-08-21 03:53:49 +0200 <int-e> It has to allocate a new Text object. And an updated internal state record for the parser.
2023-08-21 03:53:51 +0200 <wroathe> Because I look at the profile it says that 2 GB of allocations can be attributed to advanceTo
2023-08-21 03:54:03 +0200 <wroathe> Which sounds very wrong
2023-08-21 03:54:06 +0200 <int-e> There are no in-place updates.
2023-08-21 03:54:29 +0200 <int-e> It's all recreate-and-discard-old-version.
2023-08-21 03:55:15 +0200 <EvanR> normally a haskell program will allocate an insane amount of bytes per second
2023-08-21 03:55:15 +0200codaraxis__(~codaraxis@user/codaraxis) (Quit: Leaving)
2023-08-21 03:55:31 +0200 <EvanR> of course it doesn't stay because you'd run out of memory
2023-08-21 03:55:35 +0200 <wroathe> Right
2023-08-21 03:56:05 +0200 <wroathe> Yeah, resident here is only the original 8 MB, which is good... although even that looks suspicious
2023-08-21 03:56:18 +0200 <wroathe> Because even with this new version of the program I'd expect to see some Text resident
2023-08-21 03:56:56 +0200 <int-e> `Text` is just those 32 bytes that point into the big blob that holds the entire input file.
2023-08-21 03:57:12 +0200 <int-e> you can have hundreds of those and it won't be visible in the graph
2023-08-21 03:57:50 +0200 <wroathe> int-e: Yeah, but according to the profile advanceTo is allocating 2 GB worth of something over the entire ~0.5s of runtime
2023-08-21 03:57:56 +0200 <int-e> it's when you get to half a million or more that they become visible like in the other version of the program
2023-08-21 03:58:17 +0200 <wroathe> This is what I'm referring to: https://gist.github.com/JustinChristensen/72e4eae8a8e6e4e4f9be09078770c504#file-rowstate-prof-L10
2023-08-21 03:59:01 +0200 <int-e> wroathe: There may be some allocation there that can be avoided, but if so I have no clue what that is. As I said earlier, I usually don't worry about allocations all that much.
2023-08-21 03:59:02 +0200 <EvanR> how many loop iterations is that in 0.5s and how many bytes per iteration does it allocate
2023-08-21 03:59:18 +0200 <EvanR> could easily add up to 2G
2023-08-21 04:00:13 +0200 <wroathe> What I'm wondering is if the runtime is allocating a region or something and that profile is mis-attributing that region allocation to this one routine
2023-08-21 04:04:30 +0200waleee(~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 250 seconds)
2023-08-21 04:05:21 +0200 <int-e> hmm... it's quite possible that findIndex actually unpacks the text into a stream
2023-08-21 04:07:07 +0200 <wroathe> I was actually just about to test if findIndex was the culprit
2023-08-21 04:07:10 +0200 <int-e> Follow https://hackage.haskell.org/package/text-2.0.2/docs/src/Data.Text.html#findIndex and notice the absence of an implementation that *doesn't* use a stream.
2023-08-21 04:07:45 +0200 <EvanR> is something wrong with using a stream
2023-08-21 04:11:48 +0200td_(~td@i53870934.versanet.de) (Ping timeout: 256 seconds)
2023-08-21 04:13:35 +0200td_(~td@i53870925.versanet.de)
2023-08-21 04:14:15 +0200xff0x(~xff0x@2405:6580:b080:900:9c64:3e23:a36:74a0) (Ping timeout: 245 seconds)
2023-08-21 04:16:31 +0200gastus(~gastus@185.6.123.186)
2023-08-21 04:16:34 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-08-21 04:17:52 +0200 <dsal> I replaced that code that was using unsafeIOToSTM by making a pure "forgetful" map and just wrapping it in STM.
2023-08-21 04:18:00 +0200hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 245 seconds)
2023-08-21 04:18:27 +0200 <dsal> It's not *exactly* the same because that other thing was overly precise with its clock updates and stuff. We just don't want to remember everything forever, so mine's a lot more chill.
2023-08-21 04:19:39 +0200gastus_(~gastus@185.6.123.193) (Ping timeout: 244 seconds)
2023-08-21 04:20:14 +0200 <dsal> The original code was using Map.filter in a loop to drop old entries, so it wasn't exactly precise anyway (though I made all the entrypoints also check before I started making larger changes).
2023-08-21 04:20:49 +0200 <int-e> EvanR: Hmm it's more subtle than that. If `text` was compiled with optimizations, the Stream should all disappear. However, the resulting `findIndex` is too big to be inlined. Which means that the chars that are passed to the predicate all have to be boxed... though that doesn't begin to explain 2GB worth of allocations for at most 8M skipped bytes.
2023-08-21 04:21:03 +0200 <dsal> Now I just do a Map.splitLookup on a synthetic time thing which gives me all the keys that need to be deleted.
2023-08-21 04:22:42 +0200jargon(~jargon@174-22-213-62.phnx.qwest.net) (Remote host closed the connection)
2023-08-21 04:22:50 +0200 <int-e> anyway, let me get out of this rabbit hole
2023-08-21 04:23:00 +0200razetime(~quassel@117.254.36.220) (Ping timeout: 245 seconds)
2023-08-21 04:23:31 +0200 <EvanR> you can checkout anytime but never leave
2023-08-21 04:23:37 +0200razetime(~quassel@117.254.37.117)
2023-08-21 04:23:40 +0200ddellacosta(~ddellacos@146.70.168.217) (Ping timeout: 248 seconds)
2023-08-21 04:25:21 +0200 <monochrom> The singularity is in your future. >:)
2023-08-21 04:27:25 +0200 <int-e> EvanR: (More subtlety: there's also a boxed Bool in that picture... but the two values are statically allocated.)
2023-08-21 04:28:03 +0200 <EvanR> .oO(are the first few Char statically allocated too)
2023-08-21 04:28:17 +0200 <EvanR> (or the first few Int for that matter)
2023-08-21 04:28:32 +0200justsomeguy(~justsomeg@user/justsomeguy)
2023-08-21 04:28:35 +0200 <int-e> EvanR: yes but I believe only the unpackCString (spelling?) stuff actually uses that
2023-08-21 04:28:54 +0200hugo(znc@2001:6b0:17:f0a0::17)
2023-08-21 04:28:57 +0200 <int-e> And in particular, the C# constructor of Char doesn't.
2023-08-21 04:29:25 +0200 <int-e> emphasis on *believe*
2023-08-21 04:31:06 +0200ddellacosta(~ddellacos@146.70.171.136)
2023-08-21 04:35:50 +0200 <wroathe> int-e: So this version of advanceTo has no appreciable difference on the 2GB of allocations: https://gist.github.com/JustinChristensen/72e4eae8a8e6e4e4f9be09078770c504#file-sigh-hs
2023-08-21 04:36:03 +0200 <wroathe> so findIndex doesn't appear to be the problem
2023-08-21 04:36:26 +0200 <wroathe> The stateOffset is only used to compute error output, so for the purposes of testing it can be elided
2023-08-21 04:36:53 +0200Inst(~liamzy@2601:6c4:4085:6d50::85eb)
2023-08-21 04:44:17 +0200 <int-e> as you suggested earlier, it is possible that there's some misattribution there.
2023-08-21 04:44:57 +0200 <int-e> or maybe the function gets used way more often than you think due to backtracking
2023-08-21 04:46:14 +0200hsxtrt(~hsxtrt@14.200.253.168) (Quit: Leaving)
2023-08-21 04:46:40 +0200 <wroathe> Well, I just looked at the input file and there are 1,087,560 tabs and newlines in it
2023-08-21 04:46:48 +0200 <wroathe> So that should be the number of times advanceTo is called
2023-08-21 04:47:53 +0200 <int-e> EvanR: fwiw, using C# definitely results in heap allocations
2023-08-21 04:48:09 +0200 <EvanR> :t C#
2023-08-21 04:48:10 +0200 <lambdabot> error: Data constructor not in scope: C#
2023-08-21 04:48:22 +0200 <int-e> % :info Char
2023-08-21 04:48:22 +0200 <yahb2> type Char :: * ; data Char = GHC.Types.C# GHC.Prim.Char# ; -- Defined in ‘GHC.Types’ ; instance Eq Char -- Defined in ‘GHC.Classes’ ; instance Ord Char -- Defined in ‘GHC.Classes’ ; instance Enu...
2023-08-21 04:48:57 +0200 <int-e> :t GHC.Types.C#
2023-08-21 04:48:57 +0200 <EvanR> when you type 'c' is that "using C#" or a statically allocated 'c'
2023-08-21 04:48:58 +0200 <lambdabot> GHC.Prim.Char# -> Char
2023-08-21 04:49:16 +0200justsomeguy(~justsomeg@user/justsomeguy) (Ping timeout: 260 seconds)
2023-08-21 04:49:36 +0200mikoto-chan(~mikoto-ch@85-76-111-77-nat.elisa-mobile.fi) (Ping timeout: 245 seconds)
2023-08-21 04:50:04 +0200 <int-e> That's a compile time constant, so it'll be *a* statically allocated 'c'. I'm not sure that those are shared across modules.
2023-08-21 04:50:34 +0200 <EvanR> I would never presume to suggest they were!
2023-08-21 04:50:52 +0200justsomeguy(justsomegu@user/justsomeguy)
2023-08-21 04:50:59 +0200 <int-e> But I meant actually using C# as a function with unknown argument.
2023-08-21 04:51:07 +0200 <EvanR> sure
2023-08-21 04:51:44 +0200finn_elija(~finn_elij@user/finn-elija/x-0085643)
2023-08-21 04:51:44 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2023-08-21 04:51:44 +0200finn_elijaFinnElija
2023-08-21 04:54:48 +0200jpds(~jpds@gateway/tor-sasl/jpds) (Ping timeout: 246 seconds)
2023-08-21 04:55:09 +0200xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
2023-08-21 04:57:10 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 05:00:50 +0200jargon(~jargon@174-22-213-62.phnx.qwest.net)
2023-08-21 05:01:40 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 256 seconds)
2023-08-21 05:02:28 +0200jmcantrell(~weechat@user/jmcantrell)
2023-08-21 05:03:26 +0200 <wroathe> int-e: using lazy text instead of strict text resulted in 27% fewer allocations in that dropWhile implementation
2023-08-21 05:04:11 +0200 <wroathe> From 2,717,358,616 bytes down to 1,969,361,672
2023-08-21 05:04:56 +0200aforemny(~aforemny@i59F516C9.versanet.de) (Ping timeout: 246 seconds)
2023-08-21 05:05:12 +0200 <EvanR> lazy readFile will do lazy I/O (like I originally suggested)
2023-08-21 05:05:33 +0200 <EvanR> though the parsing still kind defeats some of the benefit
2023-08-21 05:05:52 +0200aforemny(~aforemny@2001:9e8:6cd8:3100:c980:385d:6185:8dda)
2023-08-21 05:07:27 +0200hsw(~hsw@2001-b030-2303-0104-0172-0025-0012-0132.hinet-ip6.hinet.net) (Quit: Leaving)
2023-08-21 05:10:52 +0200 <int-e> EvanR: on the other hand, String literals (unpackCString#) and IO (like getContents) share the same table of "low" characters.
2023-08-21 05:12:52 +0200wroathe(~wroathe@user/wroathe) (Ping timeout: 244 seconds)
2023-08-21 05:16:20 +0200shapr(~user@2600:1700:c640:3100:6898:ed8d:7f5e:e726) (Remote host closed the connection)
2023-08-21 05:16:55 +0200shapr(~user@2600:1700:c640:3100:2ac6:30d3:17d6:81ff)
2023-08-21 05:18:33 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 244 seconds)
2023-08-21 05:23:56 +0200libertyprime(~libertypr@203.96.203.44) (Ping timeout: 248 seconds)
2023-08-21 05:27:07 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 05:27:07 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 05:32:22 +0200libertyprime(~libertypr@203.96.203.44)
2023-08-21 05:34:32 +0200justsomeguy(justsomegu@user/justsomeguy) (Ping timeout: 245 seconds)
2023-08-21 05:40:12 +0200Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection)
2023-08-21 05:47:31 +0200ddellacosta(~ddellacos@146.70.171.136) (Ping timeout: 245 seconds)
2023-08-21 05:49:33 +0200ddellacosta(~ddellacos@146.70.168.136)
2023-08-21 05:50:12 +0200Inst(~liamzy@2601:6c4:4085:6d50::85eb) (Remote host closed the connection)
2023-08-21 05:50:58 +0200Inst(~liamzy@2601:6c4:4085:6d50::a0f6)
2023-08-21 05:54:59 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
2023-08-21 06:00:32 +0200actioninja(~actioninj@user/actioninja) (Quit: see ya mane)
2023-08-21 06:00:57 +0200actioninja(~actioninj@user/actioninja)
2023-08-21 06:05:37 +0200g(~glguy@libera/staff-emeritus/glguy) (Remote host closed the connection)
2023-08-21 06:05:44 +0200g(~glguy@libera/staff-emeritus/glguy)
2023-08-21 06:06:40 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-08-21 06:07:29 +0200g(~glguy@libera/staff-emeritus/glguy) (Remote host closed the connection)
2023-08-21 06:07:37 +0200g(g@libera/staff-emeritus/glguy)
2023-08-21 06:23:29 +0200jargon(~jargon@174-22-213-62.phnx.qwest.net) (Remote host closed the connection)
2023-08-21 06:23:46 +0200razetime(~quassel@117.254.37.117) (Ping timeout: 245 seconds)
2023-08-21 06:24:48 +0200mvk(~mvk@2607:fea8:5c9a:a600::1c6d) (Ping timeout: 246 seconds)
2023-08-21 06:26:12 +0200jmcantrell(~weechat@user/jmcantrell) (Quit: WeeChat 4.0.3)
2023-08-21 06:53:09 +0200libertyprime(~libertypr@203.96.203.44) (Ping timeout: 246 seconds)
2023-08-21 06:56:18 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 07:00:30 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
2023-08-21 07:01:47 +0200Inst(~liamzy@2601:6c4:4085:6d50::a0f6) (Remote host closed the connection)
2023-08-21 07:02:05 +0200Inst(~liamzy@2601:6c4:4085:6d50::85eb)
2023-08-21 07:11:12 +0200Feuermagier(~Feuermagi@user/feuermagier) (Quit: Leaving)
2023-08-21 07:11:26 +0200bjin(~bjin@user/bjin)
2023-08-21 07:15:59 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-08-21 07:20:22 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 250 seconds)
2023-08-21 07:28:23 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 07:32:32 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 240 seconds)
2023-08-21 07:34:28 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:bc38:61d8:7af5:2488) (Remote host closed the connection)
2023-08-21 07:35:37 +0200jonathan__(~jonathan@193.203.13.94)
2023-08-21 07:36:01 +0200bgs(~bgs@212-85-160-171.dynamic.telemach.net)
2023-08-21 07:37:12 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-08-21 07:41:13 +0200chele(~chele@user/chele)
2023-08-21 07:48:55 +0200michalz(~michalz@185.246.207.222)
2023-08-21 07:53:30 +0200notzmv(~zmv@user/notzmv) (Ping timeout: 246 seconds)
2023-08-21 07:55:04 +0200NewtonTrendy(uid282092@user/bopqod) (Quit: Connection closed for inactivity)
2023-08-21 08:08:29 +0200justsomeguy(~justsomeg@user/justsomeguy)
2023-08-21 08:08:42 +0200Inst(~liamzy@2601:6c4:4085:6d50::85eb) (Ping timeout: 258 seconds)
2023-08-21 08:09:48 +0200mikoto-chan(~mikoto-ch@85-76-50-50-nat.elisa-mobile.fi)
2023-08-21 08:13:19 +0200tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Remote host closed the connection)
2023-08-21 08:13:59 +0200tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303)
2023-08-21 08:15:12 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 08:15:49 +0200tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Read error: Connection reset by peer)
2023-08-21 08:16:30 +0200tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303)
2023-08-21 08:16:44 +0200shapr(~user@2600:1700:c640:3100:2ac6:30d3:17d6:81ff) (Ping timeout: 248 seconds)
2023-08-21 08:16:59 +0200acidjnk(~acidjnk@p200300d6e7072f62514217c34acbe695.dip0.t-ipconnect.de)
2023-08-21 08:19:32 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
2023-08-21 08:21:42 +0200YuutaW(~YuutaW@mail.yuuta.moe) (Ping timeout: 256 seconds)
2023-08-21 08:24:17 +0200razetime(~quassel@117.254.37.117)
2023-08-21 08:25:20 +0200YuutaW(~YuutaW@mail.yuuta.moe)
2023-08-21 08:35:30 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 08:35:38 +0200eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
2023-08-21 08:37:44 +0200justsomeguy(~justsomeg@user/justsomeguy) (Ping timeout: 246 seconds)
2023-08-21 08:38:26 +0200paddymahoney(~paddymaho@cpe883d24bcf597-cmbc4dfb741f80.cpe.net.cable.rogers.com) (Ping timeout: 246 seconds)
2023-08-21 08:40:06 +0200eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 250 seconds)
2023-08-21 08:40:39 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Quit: Leaving)
2023-08-21 08:43:56 +0200lortabac(~lortabac@2a01:e0a:541:b8f0:cc65:1a3b:6ab3:49f4)
2023-08-21 08:47:49 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 08:48:15 +0200justsomeguy(~justsomeg@user/justsomeguy)
2023-08-21 08:52:10 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Ping timeout: 246 seconds)
2023-08-21 08:52:31 +0200justsomeguy(~justsomeg@user/justsomeguy) (Ping timeout: 246 seconds)
2023-08-21 08:52:34 +0200fendor(~fendor@2a02:8388:1640:be00:b586:6c06:a58:19a3)
2023-08-21 08:58:35 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2023-08-21 09:03:02 +0200ensyde(ensyde@2600:3c02::f03c:93ff:fe9e:b831)
2023-08-21 09:06:41 +0200mikoto-chan(~mikoto-ch@85-76-50-50-nat.elisa-mobile.fi) (Ping timeout: 245 seconds)
2023-08-21 09:07:37 +0200bliminse(~bliminse@user/bliminse) (Quit: leaving)
2023-08-21 09:10:21 +0200dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 246 seconds)
2023-08-21 09:10:28 +0200rune__(sid21167@ilkley.irccloud.com)
2023-08-21 09:11:13 +0200rune__(sid21167@ilkley.irccloud.com) (Client Quit)
2023-08-21 09:14:57 +0200coot(~coot@89-69-206-216.dynamic.chello.pl)
2023-08-21 09:17:00 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au)
2023-08-21 09:17:00 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au) (Changing host)
2023-08-21 09:17:00 +0200dibblego(~dibblego@haskell/developer/dibblego)
2023-08-21 09:19:11 +0200mikoto-chan(~mikoto-ch@ip-83-134-209-157.dsl.scarlet.be)
2023-08-21 09:19:23 +0200cfricke(~cfricke@user/cfricke)
2023-08-21 09:21:54 +0200gastus(~gastus@185.6.123.186) (Ping timeout: 244 seconds)
2023-08-21 09:22:34 +0200Pickchea(~private@user/pickchea)
2023-08-21 09:26:11 +0200CiaoSen(~Jura@2a05:5800:2d6:1600:664b:f0ff:fe37:9ef)
2023-08-21 09:37:06 +0200ft(~ft@p4fc2ad78.dip0.t-ipconnect.de) (Ping timeout: 245 seconds)
2023-08-21 09:37:32 +0200mikoto-chan(~mikoto-ch@ip-83-134-209-157.dsl.scarlet.be) (Ping timeout: 252 seconds)
2023-08-21 09:41:02 +0200misterfish(~misterfis@87.215.131.102)
2023-08-21 09:43:10 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 09:43:26 +0200bliminse(~bliminse@user/bliminse)
2023-08-21 09:44:52 +0200dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 240 seconds)
2023-08-21 09:46:46 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.2)
2023-08-21 09:47:52 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 245 seconds)
2023-08-21 09:48:56 +0200ft(~ft@p4fc2ad78.dip0.t-ipconnect.de)
2023-08-21 09:49:16 +0200wrengr(~wrengr@201.59.83.34.bc.googleusercontent.com) (Remote host closed the connection)
2023-08-21 09:49:43 +0200gensyst(~gensyst@user/gensyst)
2023-08-21 09:49:47 +0200 <gensyst> I have tons of these: "newtype Lol = Lol Float", "newtype Rofl = Rofl Float".
2023-08-21 09:49:47 +0200 <gensyst> When extracting, I'm always doing "(let Lol x = lol in x)", "(let Rofl x = rofl in x)", etc.
2023-08-21 09:49:47 +0200 <gensyst> Is it possible to have one general extraction function that works for all newtypes?
2023-08-21 09:50:02 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au)
2023-08-21 09:50:02 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au) (Changing host)
2023-08-21 09:50:02 +0200dibblego(~dibblego@haskell/developer/dibblego)
2023-08-21 09:52:30 +0200mikoto-chan(~mikoto-ch@ip-83-134-209-157.dsl.scarlet.be)
2023-08-21 09:52:43 +0200 <opqdonut> gensyst: you can define your own class, or use one of the solutions on hackage like https://hackage.haskell.org/package/newtype
2023-08-21 09:53:01 +0200mima(~mmh@aftr-62-216-211-33.dynamic.mnet-online.de)
2023-08-21 09:54:03 +0200 <probie> gensyst: `Data.Coerce.coerce`?
2023-08-21 09:54:59 +0200jespada(~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net) (Remote host closed the connection)
2023-08-21 09:55:37 +0200jespada(~jespada@cpc121308-nmal25-2-0-cust15.19-2.cable.virginm.net)
2023-08-21 09:58:22 +0200econo_(uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity)
2023-08-21 09:59:30 +0200 <dminuoso> gensyst: Also, newtypes can have field accessors. So you can also write something like `newtype Lol = Lol { unLol :: Float }`, that can help some as well.
2023-08-21 10:00:22 +0200Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2023-08-21 10:02:10 +0200 <dminuoso> If you're using Lens, Control.Lens.Wrapped might be interesting to look at as well. You could also consider Generics (Control.Lens.Wrapped.Wrapped has a default implementation to look at)
2023-08-21 10:04:23 +0200notzmv(~zmv@user/notzmv)
2023-08-21 10:11:18 +0200azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2023-08-21 10:11:44 +0200azimut(~azimut@gateway/tor-sasl/azimut)
2023-08-21 10:12:23 +0200califax(~califax@user/califx) (Remote host closed the connection)
2023-08-21 10:12:46 +0200califax(~califax@user/califx)
2023-08-21 10:15:22 +0200dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 245 seconds)
2023-08-21 10:15:56 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 10:20:49 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au)
2023-08-21 10:20:49 +0200dibblego(~dibblego@116-255-1-151.ip4.superloop.au) (Changing host)
2023-08-21 10:20:49 +0200dibblego(~dibblego@haskell/developer/dibblego)
2023-08-21 10:20:59 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 10:21:55 +0200dhil(~dhil@78.45.150.83.ewm.ftth.as8758.net)
2023-08-21 10:24:00 +0200lortabac(~lortabac@2a01:e0a:541:b8f0:cc65:1a3b:6ab3:49f4) (Ping timeout: 246 seconds)
2023-08-21 10:30:42 +0200lortabac(~lortabac@2a01:e0a:541:b8f0:a6c1:e36f:a7ec:e7e5)
2023-08-21 10:35:41 +0200razetime(~quassel@117.254.37.117) (Ping timeout: 246 seconds)
2023-08-21 10:35:50 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Ping timeout: 252 seconds)
2023-08-21 10:38:02 +0200turlando(~turlando@user/turlando)
2023-08-21 10:40:48 +0200cyphase_eviltwin(~cyphase@user/cyphase)
2023-08-21 10:40:57 +0200cyphase(~cyphase@user/cyphase) (Ping timeout: 244 seconds)
2023-08-21 10:44:31 +0200 <fendor> I am working through https://blog.sumtypeofway.com/posts/introduction-to-recursion-schemes.html. the advantage of `newtype Term f = In (f (Term f))` is that I can derive, foldable, etc...
2023-08-21 10:44:38 +0200Pickchea(~private@user/pickchea) (Ping timeout: 252 seconds)
2023-08-21 10:45:25 +0200 <fendor> but I seem to be loosing the ability to derive Show for types Expr where `type Expr = Term ExprF`. Can I still derive Show somehow?
2023-08-21 10:47:32 +0200 <[Leary]> fendor: `deriving instance Show (f (Term f)) => Show (Term f)`, with StandaloneDeriving and perhaps UndecidableInstances.
2023-08-21 10:49:51 +0200 <fendor> I am a bit weary of UndecidableInstances in my code... but I suppose, it is fine in this particular instance
2023-08-21 10:51:02 +0200Inst(~liamzy@2601:6c4:4085:6d50::85eb)
2023-08-21 10:51:57 +0200 <probie> You probably want to define `Show1` (from `Data.Functor.Classes` https://hackage.haskell.org/package/base-4.18.0.0/docs/Data-Functor-Classes.html)
2023-08-21 10:53:18 +0200 <c_wraith> UndecidableInstances is harmless. If it ends up in a loop trying to figure something out, it gives an error message instead of compiling incorrectly or something
2023-08-21 10:56:31 +0200razetime(~quassel@117.254.37.117)
2023-08-21 10:59:08 +0200gensyst(~gensyst@user/gensyst) (Ping timeout: 246 seconds)
2023-08-21 11:03:08 +0200danse-nr3(~francesco@151.47.152.232)
2023-08-21 11:03:38 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 11:07:11 +0200 <fendor> it might be harmless, but unless you understand why you need it, you might run into issues later
2023-08-21 11:11:57 +0200 <fendor> probie, thanks!
2023-08-21 11:14:14 +0200Square(~Square4@user/square)
2023-08-21 11:14:26 +0200 <c_wraith> You have to try really hard to run into problems with it. You basically need to be writing fundep prolog to get UndecidableInstances to loop indefinitely
2023-08-21 11:16:03 +0200 <fendor> iirc, I encountered issues that I couldn't actually write the instances I wanted, even though it fixed my initial type error
2023-08-21 11:16:36 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Quit: Leaving)
2023-08-21 11:17:14 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-08-21 11:19:30 +0200 <[Leary]> fendor: In order to ensure instance resolution finishes within a finite number of steps, Haskell imposes the (overly strong) restriction that constraints on an instance must be smaller (in some precise sense) than the instance head. UndecidableInstances just lifts that restriction.
2023-08-21 11:20:10 +0200 <c_wraith> ah, well. There certainly are instances that don't work even with it on.
2023-08-21 11:21:00 +0200 <c_wraith> Even though GHC tells you enabling it will help - it only helps with one specific thing, and several might apply at the same time.
2023-08-21 11:22:07 +0200 <fendor> exactly
2023-08-21 11:22:28 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 256 seconds)
2023-08-21 11:30:19 +0200ft(~ft@p4fc2ad78.dip0.t-ipconnect.de) (Quit: leaving)
2023-08-21 11:35:41 +0200danse-nr3(~francesco@151.47.152.232) (Ping timeout: 248 seconds)
2023-08-21 11:37:54 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:d4d1:1f75:43b9:b6be)
2023-08-21 11:42:03 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:d4d1:1f75:43b9:b6be) (Ping timeout: 246 seconds)
2023-08-21 11:45:10 +0200whatsupdoc(uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2023-08-21 11:46:45 +0200azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 246 seconds)
2023-08-21 11:47:32 +0200Pickchea(~private@user/pickchea)
2023-08-21 11:52:03 +0200danse-nr3(~francesco@151.47.152.232)
2023-08-21 11:55:05 +0200tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
2023-08-21 11:55:32 +0200td_(~td@i53870925.versanet.de) (Ping timeout: 250 seconds)
2023-08-21 12:03:09 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2023-08-21 12:05:34 +0200ensyde(ensyde@2600:3c02::f03c:93ff:fe9e:b831) (Quit: WeeChat 4.0.3)
2023-08-21 12:07:36 +0200xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 246 seconds)
2023-08-21 12:10:44 +0200Inst(~liamzy@2601:6c4:4085:6d50::85eb) (Remote host closed the connection)
2023-08-21 12:11:03 +0200Inst(~liamzy@2601:6c4:4085:6d50::c972)
2023-08-21 12:11:13 +0200bjin(~bjin@user/bjin) (Leaving)
2023-08-21 12:17:20 +0200td_(~td@i5387092A.versanet.de)
2023-08-21 12:23:51 +0200mc47(~mc47@xmonad/TheMC47)
2023-08-21 12:24:32 +0200CiaoSen(~Jura@2a05:5800:2d6:1600:664b:f0ff:fe37:9ef) (Ping timeout: 246 seconds)
2023-08-21 12:27:16 +0200lottaquestions(~nick@2607:fa49:503d:b200:5a77:1161:fea9:1c25)
2023-08-21 12:28:49 +0200td_(~td@i5387092A.versanet.de) (Ping timeout: 246 seconds)
2023-08-21 12:35:15 +0200Inst(~liamzy@2601:6c4:4085:6d50::c972) (Remote host closed the connection)
2023-08-21 12:35:32 +0200Inst(~liamzy@2601:6c4:4085:6d50::2cf5)
2023-08-21 12:36:18 +0200ripspin(~chatzilla@1.145.138.142)
2023-08-21 12:39:23 +0200shriekingnoise(~shrieking@186.137.175.87) (Quit: Quit)
2023-08-21 12:51:38 +0200justsomeguy(~justsomeg@user/justsomeguy)
2023-08-21 12:58:48 +0200justsomeguy(~justsomeg@user/justsomeguy) (Ping timeout: 250 seconds)
2023-08-21 12:59:37 +0200xff0x(~xff0x@2405:6580:b080:900:519f:cf85:d2f3:6c08)
2023-08-21 13:01:42 +0200acidjnk(~acidjnk@p200300d6e7072f62514217c34acbe695.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
2023-08-21 13:04:42 +0200acidjnk(~acidjnk@p200300d6e7072f62bd26c55050e04c1c.dip0.t-ipconnect.de)
2023-08-21 13:09:00 +0200vglfr(~vglfr@cli-188-239-201-89.bbn.slav.dn.ua) (Ping timeout: 256 seconds)
2023-08-21 13:09:45 +0200acidjnk(~acidjnk@p200300d6e7072f62bd26c55050e04c1c.dip0.t-ipconnect.de) (Ping timeout: 244 seconds)
2023-08-21 13:10:52 +0200td_(~td@i5387093F.versanet.de)
2023-08-21 13:17:16 +0200mikoto-chan(~mikoto-ch@ip-83-134-209-157.dsl.scarlet.be) (Quit: WeeChat 3.8)
2023-08-21 13:20:44 +0200Pickchea(~private@user/pickchea) (Quit: Leaving)
2023-08-21 13:22:02 +0200cfricke(~cfricke@user/cfricke) (Ping timeout: 260 seconds)
2023-08-21 13:25:08 +0200sm(~sm@plaintextaccounting/sm)
2023-08-21 13:32:30 +0200td_(~td@i5387093F.versanet.de) (Ping timeout: 246 seconds)
2023-08-21 13:36:07 +0200Guest12(~Guest44@176.122.87.241)
2023-08-21 13:39:21 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:d4d1:1f75:43b9:b6be)
2023-08-21 13:39:22 +0200td_(~td@i5387092D.versanet.de)
2023-08-21 13:43:42 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:d4d1:1f75:43b9:b6be) (Ping timeout: 245 seconds)
2023-08-21 13:45:23 +0200 <Guest12> hello
2023-08-21 13:46:09 +0200danse-nr3(~francesco@151.47.152.232) (Ping timeout: 246 seconds)
2023-08-21 13:46:35 +0200 <Guest12> https://paste.tomsmeding.com/orqoheRZ
2023-08-21 13:48:06 +0200pointlessslippe1(~pointless@212.82.82.3) (Ping timeout: 256 seconds)
2023-08-21 13:49:59 +0200pointlessslippe1(~pointless@212.82.82.3)
2023-08-21 13:50:12 +0200 <Guest12> is it possible to specify a "specific" SomeType for Message content? or just don't use SomeType?    https://paste.tomsmeding.com/MvCm3vC8
2023-08-21 13:51:11 +0200Guest12(~Guest44@176.122.87.241) (Quit: Client closed)
2023-08-21 13:51:29 +0200Guest92(~Guest44@176.122.87.241)
2023-08-21 13:52:57 +0200razetime(~quassel@117.254.37.117) (Ping timeout: 260 seconds)
2023-08-21 13:54:07 +0200danse-nr3(~francesco@151.47.152.232)
2023-08-21 13:54:32 +0200td_(~td@i5387092D.versanet.de) (Ping timeout: 240 seconds)
2023-08-21 13:56:03 +0200kuribas(~user@2a02:1808:87:3737:23f8:531e:6ce4:5065)
2023-08-21 13:56:42 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 13:56:42 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 14:03:34 +0200SegmentationFaul(~Segmentat@185.151.84.54)
2023-08-21 14:04:02 +0200jmdaemon(~jmdaemon@user/jmdaemon) (Ping timeout: 260 seconds)
2023-08-21 14:07:07 +0200td_(~td@83.135.9.23)
2023-08-21 14:08:29 +0200Inst(~liamzy@2601:6c4:4085:6d50::2cf5) (Ping timeout: 246 seconds)
2023-08-21 14:15:26 +0200 <exarkun> I tried to write a unit-y test for custom TLS settings for use with http-client-tls (by submitting the configuration and then asking http-client's "manager" to make a connection to a server the tests run, and asserting something about the result of the connection attempt) but I have now run into the issue that the http-client's Connection type is internal (but exposed ... so ... fine I guess) and
2023-08-21 14:15:28 +0200 <exarkun> also missing basic functionality, like a Show instance. Am I barking up the wrong tree?
2023-08-21 14:15:42 +0200danse-nr3(~francesco@151.47.152.232) (Ping timeout: 246 seconds)
2023-08-21 14:16:44 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-08-21 14:17:30 +0200kitzman(~kitzman@user/dekenevs) (Quit: C-x C-c)
2023-08-21 14:18:11 +0200Guest92(~Guest44@176.122.87.241) (Quit: Client closed)
2023-08-21 14:18:15 +0200danse-nr3(~francesco@151.47.152.232)
2023-08-21 14:19:29 +0200kitzman(~kitzman@user/dekenevs)
2023-08-21 14:19:31 +0200razetime(~quassel@117.254.37.117)
2023-08-21 14:24:18 +0200dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 246 seconds)
2023-08-21 14:26:42 +0200dibblego(~dibblego@116.255.1.151)
2023-08-21 14:26:42 +0200dibblego(~dibblego@116.255.1.151) (Changing host)
2023-08-21 14:26:42 +0200dibblego(~dibblego@haskell/developer/dibblego)
2023-08-21 14:31:28 +0200ripspin(~chatzilla@1.145.138.142) (Remote host closed the connection)
2023-08-21 14:34:48 +0200SegmentationFaul(~Segmentat@185.151.84.54) (Quit: Client closed)
2023-08-21 14:40:36 +0200falafel(~falafel@216.68.6.51.dyn.plus.net)
2023-08-21 14:47:13 +0200ph88(~ph88@ip5b403cd4.dynamic.kabel-deutschland.de)
2023-08-21 14:47:32 +0200 <ph88> how can i run Control.Monad.Fail ? either with Either or with exception
2023-08-21 14:48:16 +0200 <ph88> oh nvm i guess i can turn it into Maybe
2023-08-21 14:49:32 +0200razetime(~quassel@117.254.37.117) (Ping timeout: 245 seconds)
2023-08-21 14:54:20 +0200 <ncf> > fail "boo" :: Either String ()
2023-08-21 14:54:21 +0200 <lambdabot> error:
2023-08-21 14:54:21 +0200 <lambdabot> • No instance for (MonadFail (Either String))
2023-08-21 14:54:21 +0200 <lambdabot> arising from a use of ‘fail’
2023-08-21 14:54:50 +0200 <ncf> rip
2023-08-21 14:57:00 +0200 <ncf> https://gitlab.haskell.org/ghc/ghc/-/issues/12160
2023-08-21 15:01:24 +0200mc47(~mc47@xmonad/TheMC47) (Remote host closed the connection)
2023-08-21 15:02:16 +0200danse-nr3(~francesco@151.47.152.232) (Read error: Connection reset by peer)
2023-08-21 15:02:46 +0200danse-nr3(~francesco@151.37.126.103)
2023-08-21 15:09:46 +0200 <albet70> how to construct an IO String reading element from a list one by one?
2023-08-21 15:11:27 +0200 <ncf> IORef?
2023-08-21 15:15:30 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 245 seconds)
2023-08-21 15:19:00 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-08-21 15:23:15 +0200kuribas`(~user@2a02:1808:1:281d:be13:5348:8276:dbb0)
2023-08-21 15:23:50 +0200ystael(~ystael@user/ystael)
2023-08-21 15:24:24 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 250 seconds)
2023-08-21 15:25:06 +0200kuribas(~user@2a02:1808:87:3737:23f8:531e:6ce4:5065) (Ping timeout: 260 seconds)
2023-08-21 15:27:54 +0200ccapndave(~ccapndave@xcpe-62-167-165-47.cgn.res.adslplus.ch)
2023-08-21 15:28:57 +0200hgolden(~hgolden@2603-8000-9d00-3ed1-fc05-5499-f77c-fbe5.res6.spectrum.com) (Remote host closed the connection)
2023-08-21 15:31:16 +0200SegmentationFaul(~Segmentat@185.151.84.54)
2023-08-21 15:32:06 +0200dhil(~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 252 seconds)
2023-08-21 15:35:17 +0200sm(~sm@plaintextaccounting/sm)
2023-08-21 15:36:20 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 15:36:54 +0200falafel(~falafel@216.68.6.51.dyn.plus.net) (Ping timeout: 246 seconds)
2023-08-21 15:38:55 +0200 <xerox> elements being?
2023-08-21 15:40:11 +0200ccapndave(~ccapndave@xcpe-62-167-165-47.cgn.res.adslplus.ch) (Quit: Textual IRC Client: www.textualapp.com)
2023-08-21 15:40:32 +0200wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2023-08-21 15:40:32 +0200wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2023-08-21 15:40:32 +0200wroathe(~wroathe@user/wroathe)
2023-08-21 15:40:36 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
2023-08-21 15:43:58 +0200ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2023-08-21 15:44:21 +0200ec(~ec@gateway/tor-sasl/ec)
2023-08-21 15:45:05 +0200danse-nr3(~francesco@151.37.126.103) (Ping timeout: 245 seconds)
2023-08-21 15:49:38 +0200danse-nr3(~francesco@151.37.126.103)
2023-08-21 15:52:20 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-08-21 15:55:55 +0200ripspin(~chatzilla@1.145.177.194)
2023-08-21 15:56:21 +0200kuribas`(~user@2a02:1808:1:281d:be13:5348:8276:dbb0) (Ping timeout: 246 seconds)
2023-08-21 15:59:04 +0200ddellacosta(~ddellacos@146.70.168.136) (Ping timeout: 250 seconds)
2023-08-21 16:01:52 +0200wroathe(~wroathe@user/wroathe) (Ping timeout: 260 seconds)
2023-08-21 16:05:11 +0200Sgeo(~Sgeo@user/sgeo)
2023-08-21 16:08:34 +0200mc47(~mc47@xmonad/TheMC47)
2023-08-21 16:10:07 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 16:11:53 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Client Quit)
2023-08-21 16:14:12 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 16:23:14 +0200Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df) (Ping timeout: 246 seconds)
2023-08-21 16:23:15 +0200jonathan(~jonathan@193.203.13.94)
2023-08-21 16:23:41 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 16:23:41 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 16:29:03 +0200Ram-Z(~Ram-Z@li1814-254.members.linode.com)
2023-08-21 16:31:12 +0200m21it(~m21it@2800:ac:c020:f24b:2278:812f:509e:9a2f)
2023-08-21 16:34:52 +0200 <m21it> Hello! I'm writing some instances for the Data.Data.Data class and I can not understand how `toConstr` and `dataTypeOf` could actually work, because they do seem recursively depend on each other through the `DataRep`.
2023-08-21 16:35:06 +0200 <m21it> https://hackage.haskell.org/package/base-4.18.0.0/docs/src/Data.Data.html#DataType
2023-08-21 16:36:37 +0200 <m21it> I did some tests `x `shouldBe` Data.fromConstr (Data.toConstr x)` but it seems to be non-terminating due to infinite recursion
2023-08-21 16:39:37 +0200Ram-Z(~Ram-Z@li1814-254.members.linode.com) (Quit: ZNC - http://znc.in)
2023-08-21 16:41:24 +0200 <m21it> It seems to be Constr does depend on DataType does depend on DataRep does depend of Constr..
2023-08-21 16:41:28 +0200Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df)
2023-08-21 16:42:03 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Quit: Leaving)
2023-08-21 16:42:24 +0200acidjnk(~acidjnk@p200300d6e7072f62b0c5e6199a92dfb8.dip0.t-ipconnect.de)
2023-08-21 16:46:31 +0200thegeekinside(~thegeekin@189.180.79.225)
2023-08-21 16:50:52 +0200jonathan(~jonathan@193.203.13.94) (Quit: Leaving)
2023-08-21 16:51:04 +0200srk-(~sorki@user/srk)
2023-08-21 16:54:58 +0200srk(~sorki@user/srk) (Ping timeout: 252 seconds)
2023-08-21 16:54:58 +0200srk-srk
2023-08-21 16:55:06 +0200misterfish(~misterfis@87.215.131.102) (Ping timeout: 256 seconds)
2023-08-21 16:55:48 +0200random-jellyfish(~random-je@user/random-jellyfish)
2023-08-21 17:02:16 +0200 <random-jellyfish> is there a way to convert an imperative algorithm with if statements, while/for loops, break statements, case statements etc. into finite state machine algorithm?
2023-08-21 17:02:32 +0200 <random-jellyfish> is there like a standard way that I can read about and reuse?
2023-08-21 17:04:19 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2023-08-21 17:04:56 +0200ripspin(~chatzilla@1.145.177.194) (Ping timeout: 250 seconds)
2023-08-21 17:05:42 +0200dsfsdfsdf(~dsfsdfsdf@ip4d148080.dynamic.kabel-deutschland.de)
2023-08-21 17:06:11 +0200 <m21it> random-jellyfish: yes, StateT monad transformer
2023-08-21 17:07:19 +0200 <m21it> random-jellyfish: and if you need more imperative features than just state, you could use other transformers like for example ExceptT for early return/brake
2023-08-21 17:07:42 +0200 <random-jellyfish> can it be implemented in other languages? e.g. CommonLisp?
2023-08-21 17:07:54 +0200dsfsdfsdf(~dsfsdfsdf@ip4d148080.dynamic.kabel-deutschland.de) (Client Quit)
2023-08-21 17:08:41 +0200azimut(~azimut@gateway/tor-sasl/azimut)
2023-08-21 17:09:21 +0200gatekempt(~gatekempt@user/gatekempt)
2023-08-21 17:10:12 +0200 <m21it> It depends, I don't know. Monads and monad transformers do depend on ad-hoc polymorphism (type classes) and higher-order types. In other languages there will be other instruments
2023-08-21 17:10:31 +0200Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542)
2023-08-21 17:14:36 +0200 <[Leary]> m21it: Mutual recursion (whether of values or data types) is not inherently problematic. The docs for the class show what a GHC generated instance looks like, and you can see it ties a knot with `con_C1`, `con_C2` and `ty_T`---this is fine, so long as `mkConstr` and `mkDataType` are not strict in these arguments.
2023-08-21 17:14:44 +0200 <[Leary]> > (fromConstr . toConstr :: Data a => a -> a) <$> [Nothing, Just ()]
2023-08-21 17:14:46 +0200 <lambdabot> [Nothing,Just *Exception: Data.Data.fromConstr
2023-08-21 17:16:37 +0200 <ph88> is there some auto fixer program that can do things like remove unused imports. replace unused variables by underscore etc ?
2023-08-21 17:17:24 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 17:17:25 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 17:19:01 +0200lortabac(~lortabac@2a01:e0a:541:b8f0:a6c1:e36f:a7ec:e7e5) (Quit: WeeChat 2.8)
2023-08-21 17:21:24 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:75c0:69c6:c6bf:d46c)
2023-08-21 17:21:27 +0200 <m21it> ph88: hlint and fourmolu are good to remove redundant stuff and do simple auto-refactorings
2023-08-21 17:21:41 +0200ripspin(~chatzilla@1.145.251.200)
2023-08-21 17:22:17 +0200 <ph88> thx
2023-08-21 17:30:07 +0200 <EvanR> express an imperative algorithm with an actual finite state machine is a more narrow objective though, not just can you write it in haskell
2023-08-21 17:30:25 +0200 <geekosaur> https://hackage.haskell.org/package/HaRe seems a bit out of date
2023-08-21 17:30:52 +0200 <geekosaur> but I think most of its goals have been integrated into HLS, not that that has a batch mode
2023-08-21 17:32:01 +0200 <geekosaur> also, PSA: I just got the buggy Linux kernel on my Ubuntu 22.04.2 system, look out for more "mmap 4096 bytes" complaints
2023-08-21 17:32:22 +0200 <m21it> geekosaur: oh, hi! You are in this chat as well :)
2023-08-21 17:32:32 +0200 <geekosaur> (luckily I already upgraded to a GHC that works compatibly with the new kernel)
2023-08-21 17:32:42 +0200 <geekosaur> this is actually my main chat
2023-08-21 17:33:32 +0200Square(~Square4@user/square) (Ping timeout: 248 seconds)
2023-08-21 17:38:44 +0200NewtonTrendy(uid282092@user/bopqod)
2023-08-21 17:38:51 +0200azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 246 seconds)
2023-08-21 17:41:00 +0200 <[Leary]> random-jellyfish: Seems like FSM aren't Turing complete, so an imperative language with while loops is probably too powerful to be translated.
2023-08-21 17:42:02 +0200 <EvanR> yeah, the loops are the fundamental issue. But also imperative code often has int variables, which starts to stretch the definition of Finite State
2023-08-21 17:42:09 +0200rembo10(~rembo10@main.remulis.com) (Quit: ZNC 1.8.2 - https://znc.in)
2023-08-21 17:42:20 +0200 <EvanR> 4 ints is 2^(4*64) states
2023-08-21 17:42:28 +0200rembo10(~rembo10@main.remulis.com)
2023-08-21 17:43:04 +0200sefidel(~sefidel@user/sefidel) (Ping timeout: 244 seconds)
2023-08-21 17:43:11 +0200 <random-jellyfish> yeah it's true some cases might not be translatable
2023-08-21 17:43:20 +0200sefidel(~sefidel@user/sefidel)
2023-08-21 17:47:58 +0200random-jellyfish(~random-je@user/random-jellyfish) (Quit: Client closed)
2023-08-21 17:52:40 +0200chele(~chele@user/chele) (Remote host closed the connection)
2023-08-21 17:53:33 +0200ripspin(~chatzilla@1.145.251.200) (Remote host closed the connection)
2023-08-21 17:56:05 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2023-08-21 17:56:59 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2023-08-21 17:57:23 +0200Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df) (Quit: ZNC - http://znc.in)
2023-08-21 17:59:26 +0200Ram-Z(~Ram-Z@li1814-254.members.linode.com)
2023-08-21 18:00:08 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2023-08-21 18:01:04 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2023-08-21 18:02:19 +0200Tuplanolla(~Tuplanoll@91-159-68-236.elisa-laajakaista.fi)
2023-08-21 18:05:01 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2023-08-21 18:05:36 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-08-21 18:05:52 +0200dhil(~dhil@78.45.150.83.ewm.ftth.as8758.net)
2023-08-21 18:06:31 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Client Quit)
2023-08-21 18:06:51 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-08-21 18:11:28 +0200gmg(~user@user/gehmehgeh)
2023-08-21 18:16:56 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2023-08-21 18:16:58 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 18:17:33 +0200tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net)
2023-08-21 18:19:34 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Client Quit)
2023-08-21 18:22:13 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
2023-08-21 18:22:41 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643)
2023-08-21 18:22:58 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2023-08-21 18:23:36 +0200dcoutts(~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 260 seconds)
2023-08-21 18:24:23 +0200razetime(~quassel@117.254.37.154)
2023-08-21 18:24:36 +0200thegeekinside(~thegeekin@189.180.79.225) (Ping timeout: 245 seconds)
2023-08-21 18:25:21 +0200thegeekinside(~thegeekin@189.180.79.225)
2023-08-21 18:25:30 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 245 seconds)
2023-08-21 18:25:55 +0200woffs(3cd46299b2@woffs.de)
2023-08-21 18:37:02 +0200machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 245 seconds)
2023-08-21 18:39:32 +0200m21it(~m21it@2800:ac:c020:f24b:2278:812f:509e:9a2f) (Remote host closed the connection)
2023-08-21 18:40:02 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 18:40:03 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 18:42:39 +0200vglfr(~vglfr@145.224.100.231)
2023-08-21 18:43:06 +0200oo_miguel(~Thunderbi@78-11-179-96.static.ip.netia.com.pl)
2023-08-21 18:43:55 +0200SegmentationFaul(~Segmentat@185.151.84.54) (Quit: Client closed)
2023-08-21 18:44:25 +0200vglfr(~vglfr@145.224.100.231) (Read error: Connection reset by peer)
2023-08-21 18:44:35 +0200vglfr(~vglfr@145.224.100.231)
2023-08-21 18:46:42 +0200vglfr(~vglfr@145.224.100.231) (Read error: Connection reset by peer)
2023-08-21 18:50:53 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 18:51:40 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
2023-08-21 18:52:07 +0200woffs(3cd46299b2@woffs.de) ()
2023-08-21 18:52:14 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643)
2023-08-21 18:53:41 +0200pavonia(~user@user/siracusa) (Quit: Bye!)
2023-08-21 19:02:38 +0200danse-nr3(~francesco@151.37.126.103) (Read error: Connection reset by peer)
2023-08-21 19:03:07 +0200danse-nr3(~francesco@151.47.168.22)
2023-08-21 19:04:16 +0200myyo(~myyo@75-166-145-203.hlrn.qwest.net)
2023-08-21 19:08:00 +0200razetime(~quassel@117.254.37.154) (Ping timeout: 245 seconds)
2023-08-21 19:09:44 +0200shapr(~user@2600:1700:c640:3100:4414:113a:dbea:a6ec)
2023-08-21 19:10:04 +0200zer0bitz(~zer0bitz@user/zer0bitz)
2023-08-21 19:14:30 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Ping timeout: 250 seconds)
2023-08-21 19:14:30 +0200jmcantrell(~weechat@user/jmcantrell)
2023-08-21 19:15:31 +0200ars23(~ars23@92.81.96.66)
2023-08-21 19:15:44 +0200ars23(~ars23@92.81.96.66) (Changing host)
2023-08-21 19:15:44 +0200ars23(~ars23@user/ars23)
2023-08-21 19:15:55 +0200ars23(~ars23@user/ars23) (Remote host closed the connection)
2023-08-21 19:17:04 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2023-08-21 19:17:21 +0200myyo(~myyo@75-166-145-203.hlrn.qwest.net) ()
2023-08-21 19:18:17 +0200 <dminuoso> EvanR: 2^(4*64) is quite... finite?
2023-08-21 19:18:24 +0200 <dminuoso> It's not less finite than 10.
2023-08-21 19:18:35 +0200zer0bitz(~zer0bitz@user/zer0bitz) (Read error: Connection reset by peer)
2023-08-21 19:18:36 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 19:18:48 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 19:20:05 +0200 <EvanR> and ram is finite so every algorithm is O(1)
2023-08-21 19:20:26 +0200 <dminuoso> Well RAM is usually not part of the definition of most languages.
2023-08-21 19:20:40 +0200 <dminuoso> So if we consider something like Integer its a different story, because its unbounded in principle.
2023-08-21 19:20:44 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-08-21 19:20:46 +0200 <dminuoso> But Int is very finite.
2023-08-21 19:22:15 +0200 <mauke> fortunately C isn't turing complete, so it is always O(1)
2023-08-21 19:22:19 +0200 <mauke> which explains its speed
2023-08-21 19:22:22 +0200 <EvanR> having spent time in the godot discord you have this idea that a finite state machine is a particular way of writing an imperative algorithm with if statements and for loops, which is what that discussion immediately sounded like because no one was actually talking about finite state machines
2023-08-21 19:23:47 +0200 <EvanR> finite or not 2^256 sets of rules isn't practical
2023-08-21 19:25:12 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 240 seconds)
2023-08-21 19:27:17 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2023-08-21 19:28:59 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 19:29:40 +0200 <Athas> Why is the dynamically linked binary I build with 'cabal build' 120MiB (86MiB after stripping), while the statically linked binary I build with Nix only 43MiB?
2023-08-21 19:29:51 +0200 <Athas> Same version of GHC and almost same Hackage dependencies.
2023-08-21 19:30:14 +0200 <Athas> Also same GHC options, unless Nix sets something unusual.
2023-08-21 19:37:52 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Ping timeout: 240 seconds)
2023-08-21 19:38:32 +0200kimiamania600(~65804703@user/kimiamania)
2023-08-21 19:38:48 +0200kimiamania60(~65804703@user/kimiamania) (Ping timeout: 244 seconds)
2023-08-21 19:38:48 +0200kimiamania600kimiamania60
2023-08-21 19:40:38 +0200shapr(~user@2600:1700:c640:3100:4414:113a:dbea:a6ec) (Ping timeout: 246 seconds)
2023-08-21 19:44:09 +0200danse-nr3(~francesco@151.47.168.22) (Remote host closed the connection)
2023-08-21 19:44:31 +0200danse-nr3(~francesco@151.47.168.22)
2023-08-21 19:47:20 +0200danza(~francesco@151.47.168.22)
2023-08-21 19:48:21 +0200ddellacosta(~ddellacos@146.70.168.100)
2023-08-21 19:50:18 +0200danse-nr3(~francesco@151.47.168.22) (Ping timeout: 246 seconds)
2023-08-21 19:58:52 +0200 <tomsmeding> Athas: any striking differences when running this? objdump -h $EXECNAME | awk '{print $3 " " $2}' | grep '^[0-9a-f]\+ ' | sort
2023-08-21 20:00:25 +0200teddyc(theodorc@cassarossa.samfundet.no) (Quit: WeeChat 3.0)
2023-08-21 20:01:16 +0200kimiamania60(~65804703@user/kimiamania) (Ping timeout: 245 seconds)
2023-08-21 20:02:00 +0200 <Athas> The .text and .data sections are only half the size in the Nix-built one.
2023-08-21 20:02:17 +0200 <geekosaur> sounds like it uses -split-sections?
2023-08-21 20:02:22 +0200 <Athas> Which of them?
2023-08-21 20:02:49 +0200 <geekosaur> what?
2023-08-21 20:03:20 +0200 <geekosaur> oh. I mean nix does
2023-08-21 20:03:21 +0200 <Athas> Is it the Nix or the cabal one that you think uses -split-sections?
2023-08-21 20:03:42 +0200 <Athas> Is there a reason not to use -split-sections, if it makes such a large difference?
2023-08-21 20:03:43 +0200 <geekosaur> it means the linker can do more pruning of unusede code/data
2023-08-21 20:03:51 +0200 <geekosaur> portability, mostly
2023-08-21 20:04:31 +0200 <geekosaur> also it's somewhat slower to build and in particuloar link
2023-08-21 20:04:48 +0200 <geekosaur> (granted, not as horrendously slow as the old -split-objs)
2023-08-21 20:05:03 +0200 <tomsmeding> portability across linkers or portability across loaders (running platforms)?
2023-08-21 20:05:25 +0200 <geekosaur> neither os x nor windows supports -split-sections
2023-08-21 20:05:27 +0200mc47(~mc47@xmonad/TheMC47) (Remote host closed the connection)
2023-08-21 20:06:53 +0200 <Athas> Presumably GHC knows which operating system it is running on.
2023-08-21 20:07:48 +0200 <geekosaur> yes, it just whines if you use it on the wrong platform, but some people don't like that
2023-08-21 20:08:18 +0200kimiamania600(~65804703@user/kimiamania)
2023-08-21 20:10:47 +0200 <geekosaur> also it puts a lot of load on the linker, meaning you should prefer `ld.gold`, but you should anyway as there's a bug iirc in the old bfd linker that ghc tickles
2023-08-21 20:16:24 +0200 <geekosaur> (or a non-GNU linker if you are on an ELF platform that has one)
2023-08-21 20:19:11 +0200ph88(~ph88@ip5b403cd4.dynamic.kabel-deutschland.de) (Remote host closed the connection)
2023-08-21 20:25:41 +0200m1dnight(~christoph@78-22-4-67.access.telenet.be) (Read error: Connection reset by peer)
2023-08-21 20:26:42 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2023-08-21 20:26:59 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk)
2023-08-21 20:27:24 +0200tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-08-21 20:29:19 +0200eggplantade(~Eggplanta@2600:1700:38c5:d800:75c0:69c6:c6bf:d46c) (Remote host closed the connection)
2023-08-21 20:29:59 +0200mima(~mmh@aftr-62-216-211-33.dynamic.mnet-online.de) (Ping timeout: 246 seconds)
2023-08-21 20:31:38 +0200m1dnight(~christoph@78-22-4-67.access.telenet.be)
2023-08-21 20:36:31 +0200fendor(~fendor@2a02:8388:1640:be00:b586:6c06:a58:19a3) (Remote host closed the connection)
2023-08-21 20:38:44 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2023-08-21 20:38:59 +0200waleee(~waleee@2001:9b0:21c:4000:5bf9:6515:c030:57b7)
2023-08-21 20:47:34 +0200Pickchea(~private@user/pickchea)
2023-08-21 21:00:20 +0200Simikando(~Simikando@adsl-dyn1.91-127-51.t-com.sk) (Quit: Leaving)
2023-08-21 21:02:02 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2023-08-21 21:03:34 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net)
2023-08-21 21:03:34 +0200ulysses4ever(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2023-08-21 21:04:24 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2023-08-21 21:08:33 +0200zer0bitz(~zer0bitz@user/zer0bitz)
2023-08-21 21:15:07 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-08-21 21:19:30 +0200shapr(~user@2600:1700:c640:3100:65f2:5dc9:6ef9:713)
2023-08-21 21:29:09 +0200jmdaemon(~jmdaemon@user/jmdaemon)
2023-08-21 21:29:49 +0200eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
2023-08-21 21:34:11 +0200eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 245 seconds)
2023-08-21 21:49:48 +0200bramhaag7(~bramhaag@134.195.121.39)
2023-08-21 21:50:55 +0200bramhaag(~bramhaag@134.195.121.39) (Ping timeout: 246 seconds)
2023-08-21 21:51:45 +0200ft(~ft@p4fc2ad78.dip0.t-ipconnect.de)
2023-08-21 21:54:12 +0200bramhaag7(~bramhaag@134.195.121.39) (Ping timeout: 260 seconds)
2023-08-21 21:55:25 +0200bramhaag(~bramhaag@134.195.121.39)
2023-08-21 22:01:27 +0200jonathan__(~jonathan@193.203.13.94) (Remote host closed the connection)
2023-08-21 22:01:52 +0200jonathan__(~jonathan@193.203.13.94)
2023-08-21 22:01:58 +0200bramhaag(~bramhaag@134.195.121.39) (Quit: The Lounge - https://thelounge.chat)
2023-08-21 22:03:08 +0200bramhaag7(~bramhaag@198.8.58.39)
2023-08-21 22:03:30 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 250 seconds)
2023-08-21 22:06:13 +0200idgaen(~idgaen@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 4.0.2)
2023-08-21 22:06:37 +0200econo_(uid147250@2a03:5180:f::2:3f32)
2023-08-21 22:15:01 +0200Square2(~Square4@user/square)
2023-08-21 22:15:20 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl)
2023-08-21 22:17:19 +0200_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-08-21 22:25:28 +0200fendor(~fendor@2a02:8388:1640:be00:b586:6c06:a58:19a3)
2023-08-21 22:25:28 +0200misterfish(~misterfis@84-53-85-146.bbserv.nl) (Ping timeout: 256 seconds)
2023-08-21 22:26:29 +0200son0p(~ff@191.104.6.44)
2023-08-21 22:29:54 +0200dhil(~dhil@78.45.150.83.ewm.ftth.as8758.net) (Ping timeout: 246 seconds)
2023-08-21 22:30:50 +0200ulysses4ever(~artem@73.145.241.240)
2023-08-21 22:32:54 +0200artem(~artem@c-73-103-90-145.hsd1.in.comcast.net) (Ping timeout: 246 seconds)
2023-08-21 22:39:47 +0200artem(~artem@73.145.241.240)
2023-08-21 22:39:47 +0200ulysses4ever(~artem@73.145.241.240) (Read error: Connection reset by peer)
2023-08-21 22:40:10 +0200tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-08-21 22:47:41 +0200ulysses4ever(~artem@73.145.241.240)
2023-08-21 22:47:41 +0200artem(~artem@73.145.241.240) (Read error: Connection reset by peer)
2023-08-21 22:48:03 +0200tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-08-21 22:51:32 +0200coot(~coot@89-69-206-216.dynamic.chello.pl) (Quit: coot)
2023-08-21 22:55:05 +0200NewtonTrendy(uid282092@user/bopqod) (Quit: Connection closed for inactivity)
2023-08-21 22:59:51 +0200jonathan__(~jonathan@193.203.13.94) (Ping timeout: 246 seconds)
2023-08-21 23:03:11 +0200danza_(~francesco@151.47.175.249)
2023-08-21 23:03:19 +0200sm(~sm@plaintextaccounting/sm)
2023-08-21 23:04:46 +0200ulysses4ever(~artem@73.145.241.240) (Ping timeout: 260 seconds)
2023-08-21 23:05:18 +0200danza(~francesco@151.47.168.22) (Ping timeout: 252 seconds)
2023-08-21 23:06:31 +0200bgs(~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
2023-08-21 23:17:22 +0200Pickchea(~private@user/pickchea) (Quit: Leaving)
2023-08-21 23:19:36 +0200sm(~sm@plaintextaccounting/sm) (Quit: sm)
2023-08-21 23:20:14 +0200Guest|16(~Guest|16@174.27.143.6)
2023-08-21 23:22:55 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net)
2023-08-21 23:28:00 +0200nate2(~nate@c-98-45-169-16.hsd1.ca.comcast.net) (Ping timeout: 250 seconds)
2023-08-21 23:28:01 +0200falafel(~falafel@216.68.6.51.dyn.plus.net)
2023-08-21 23:35:47 +0200michalz(~michalz@185.246.207.222) (Remote host closed the connection)
2023-08-21 23:42:50 +0200jargon(~jargon@174-22-213-62.phnx.qwest.net)
2023-08-21 23:44:02 +0200fendor(~fendor@2a02:8388:1640:be00:b586:6c06:a58:19a3) (Remote host closed the connection)
2023-08-21 23:45:39 +0200ulysses4ever(~artem@73.145.240.4)
2023-08-21 23:50:34 +0200NewtonTrendy(uid282092@user/bopqod)
2023-08-21 23:52:08 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net)
2023-08-21 23:52:37 +0200ulysses4ever(~artem@73.145.240.4) (Ping timeout: 260 seconds)
2023-08-21 23:54:09 +0200Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Quit: Laa shay'a waqi'un moutlaq bale kouloun moumkine)
2023-08-21 23:55:31 +0200Lord_of_Life(~Lord@user/lord-of-life/x-2819915)
2023-08-21 23:59:09 +0200arahael(~arahael@119-18-1-27.771201.syd.nbn.aussiebb.net) (Ping timeout: 246 seconds)
2023-08-21 23:59:26 +0200mjt128(~user@2604:3d09:3e79:f200:7249:9780:ed33:b6f3)