Home liberachat/#kmonad: Logs Calendar

Logs on 2021-07-22 (liberachat/#kmonad)

03:27:40 <contrapunctus> I've started writing a kmonad configuration. It seems very powerful and I'm excitedly looking forward to all the things it can do. However, the tutorial is rather difficult for a newcomer to use to get started...the Diataxis Framework (https://diataxis.fr) would call it an "explanation" (another useful kind of documentation, but serving a different purpose than a tutorial).
03:30:29 <contrapunctus> So I'm thinking of what might go into a tutorial. It has to have clear goals at every step, and it does not have to do things the "best" way, or explain/mention all alternatives - it just has to be fun and be enough to get someone started. It's also "learning by doing", rather than "learning by understanding". (The example configurations helped in this regard, but a more focused tutorial would be pre
03:30:29 <contrapunctus> ferable.)
04:15:49 wolficefang[m] joins (~wolficefa@2001:470:69fc:105::a3f1)
04:16:10 <wolficefang[m]> Hello?
04:16:33 <contrapunctus> wolficefang[m]: hello
04:19:18 <wolficefang[m]> Oh cool this works.
04:19:19 <wolficefang[m]> uhh I just wanted to make sure this is the actual kmonad IRC (since I can't see chat history, only user join/leave logs in Element.)
04:19:19 <wolficefang[m]> I didn't really have a question or anything.
04:29:04 <contrapunctus> Cool 🙂️ I just discovered kmonad yesterday 😅️
04:40:50 <contrapunctus> Hm...the docs say "A tap-macro can take an optional :delay keyword (in ms)", but when I do a dry-run with this configuration, I get "parse error", "unexpected ':'" - http://ix.io/3tF4
05:03:26 niemand joins (~niemand@p54a9c03a.dip0.t-ipconnect.de)
05:04:16 × niemand quits (~niemand@p54a9c03a.dip0.t-ipconnect.de) (Client Quit)
05:04:34 niemand joins (~niemand@p54a9c03a.dip0.t-ipconnect.de)
05:08:35 × niemand quits (~niemand@p54a9c03a.dip0.t-ipconnect.de) (Client Quit)
07:51:58 <Solid> contrapunctus: I'd agree that a proper "step-by-step" tutorial would be a nice addition
07:52:25 <Solid> but I'm sort of burned out from writing so much documentation for xmonad, so any help is welcome :)
07:52:58 <Solid> the :delay keyword is not in any released version yet, so if you've installed kmonad via your system's package manager you probably won't have it yet
08:44:42 <contrapunctus> Solid: glad to hear you like the idea. I might try writing one, or foundations of one anyway 🙂️
08:54:59 <contrapunctus> Hm...I don't understand how to specify what I'm trying to get. According to the examples, `(defalias parens (tap-macro \( P5 \) P5 Left) left-shift (tap-hold-next @parens LeftShift))` ought to work, but I get `unexpected '@'` `expecting button` 🤔️
08:58:46 <Solid> ah, that's a pretty bad error message
08:58:51 <Solid> but you need a timeout for tap-hold-next
09:07:21 <contrapunctus> Solid: ah, thanks! Finally no more errors ^^
10:34:15 <contrapunctus> Urgh, I can't get past the uinput permission errors. My user is member of both input and uinput, but FWIW `groups` only displays this when I run it as root (`groups <user>`). I've followed all the steps in the FAQ :\
10:46:05 <Tisoxin> contrapunctus: Did you reboot?
10:47:27 <Tisoxin> and apart from that…root is member of input & uinput but not your account?
11:22:07 <contrapunctus> Tisoxin: tried rebooting too, no luck.
11:28:41 <Tisoxin> <Tisoxin "and apart from that…root is memb"> ?
11:30:33 <contrapunctus> Ah, finally got it to run. My udev rules file had the wrong extension.
11:30:45 <Tisoxin> ok
11:51:02 <contrapunctus> I've managed to get Space to act as Ctrl, very cool! 😀
11:53:55 <contrapunctus> I'm trying to get Shift to send `()<left>` when tapped; I bound `(tap-next (tap-macro \( P20 \) P20 Left) LeftShift)` to the Shift keys, but it presses Left indefinitely until I tap something else. 🤔
11:57:37 <Solid> something doesn't get released huh
11:57:45 <Solid> I guess a hack would be Left P5 or something
12:03:06 <contrapunctus> Solid: thanks, that worked 🙂
12:07:59 <contrapunctus> Now for the other mystery...when I invoke `kmonad file.kbd`, it emits a ton of whitespace 🤔 it wasn't this way in earlier iterations of my config, which looks like this right now - http://ix.io/3tGx
13:16:08 Solid_ joins (~slot@xmonad/slotThe)
13:18:46 × Solid quits (~slot@xmonad/slotThe) (Ping timeout: 255 seconds)
13:18:55 Guest4 joins (~Guest4@49.36.233.220)
13:19:06 <Guest4> hello
13:19:21 Solid_ is now known as Solid
13:19:39 <Solid> hi
13:19:46 <Guest4> hey
13:20:44 <Guest4> can kmonad be used to switch layouts frequently?
13:20:54 <Guest4> like switch to qwerty when gaming
13:26:08 <Solid> sure, that's not a problem
13:27:16 <Guest4> oh nice
13:28:24 <Solid> there is a layer-switch function that just switches to a layer
13:29:00 <Solid> you can combine this with cmd-button to also execute some (probably necessary) setxkbmap commands in case you want to switch languages as well
13:29:23 <Guest4> hmm gotta look into it
13:30:01 <Solid> e.g. something like `(around (cmd-button "setxkbmap de") (layer-switch qwertz))` would switch to a defined `qwertz` layer and tell X that you want german language support
13:31:11 <Guest4> interesting
13:32:19 <Guest4> where to put the config file in linux?
13:32:49 <Tisoxin> Guest4: Do you use an ergonomic layout?
13:33:10 <Tisoxin> The kmonad config file?
13:33:17 <Guest4> yeah the kmonad config file
13:33:23 <Guest4> whats an ergonomic layout?
13:33:26 <Tisoxin> afaik there is no specific location
13:33:40 <Tisoxin> you just pass the config file from the command line
13:33:41 <Solid> Guest4: you give kmonad the path to the config file as a positional argument, so place it wherever you want
13:33:50 <Guest4> ohk
13:34:56 <Tisoxin> Guest4: Well, why would you want to switch layouts for gaming, if you don't use an additional ergonomic one ? That's the only reason i know
13:35:15 <Tisoxin> ergonomic layouts are layouts, which are optimized for typing
13:35:31 <Guest4> oh i thought you meant ergonomic keyboard
13:35:37 <Tisoxin> (qwerty is optimized for typewriters)
13:35:38 <Guest4> yeah i do use colemak dh
13:35:40 <Guest4> but im a begginer
13:35:50 <Tisoxin> ah, ok
13:36:06 <Tisoxin> How long do you type colemak?
13:36:10 <Solid> Tisoxin: another reason may be that they use home-row modifiers; I can imagine things like that being a bit awkward when accidentally pressed when gaming
13:36:25 <Guest4> its my day 5 on colemak dh
13:36:27 <Guest4> im on 40wpm
13:36:33 <Tisoxin> yes, but they wanted to switch layouts, not layers
13:36:35 <Tisoxin> nice
13:36:42 <Guest4> thanks :)
13:36:45 <Solid> ah, good point
13:36:55 <Tisoxin> i use the ergonomic layout bone
13:37:17 <Guest4> so i guess i could use vim with layers functionality?
13:37:56 <Tisoxin> depends on what you want to implement
13:38:03 <Tisoxin> https://neo-layout.org/Layouts/bone/
13:39:50 <Guest4> exec /path/to/kmonad /path/to/config.kbd || exit 1
13:39:55 <Tisoxin> Guest4: You might not be interested (since you've already begun learning colemak) but there are actually better layouts than colemak (although colemak is pretty sane), e.g. workman, 3l, etc.
13:40:02 <Guest4> in this is path to kmonad the kmonad.service file?
13:40:33 <Tisoxin> https://github.com/jackrosenthal/threelayout
13:40:37 <Guest4> Tisoxin hmm i willl look into it
13:41:02 <Tisoxin> https://colemakmods.github.io/ergonomic-mods/angle.html
13:41:13 <Tisoxin> https://workmanlayout.org/
13:41:29 <Tisoxin> ok, enough link spamming :]
13:44:48 × Guest4 quits (~Guest4@49.36.233.220) (Quit: Client closed)
13:48:06 <Tisoxin> !help
13:48:45 <Tisoxin> @help
13:48:45 <lambdabot> help <command>. Ask for help for <command>. Try 'list' for all commands
13:48:52 <Tisoxin> @list
13:48:52 <lambdabot> What module? Try @listmodules for some ideas.
13:48:59 <Tisoxin> @listmodules
13:48:59 <lambdabot> activity base bf check compose dice dict djinn dummy elite eval filter free fresh haddock help hoogle instances irc karma localtime metar more oeis offlineRC pl pointful poll pretty quote search
13:48:59 <lambdabot> seen slap source spell system tell ticker todo topic type undo unlambda unmtl version where
13:49:36 <Tisoxin> @type (<*>) (<*>) (<*>)
13:49:37 <lambdabot> error:
13:49:37 <lambdabot> • Occurs check: cannot construct the infinite type:
13:49:37 <lambdabot> f ~ (->) (f (f b))
13:49:50 <Tisoxin> arg
13:50:58 <Tisoxin> @type (.) (<$>) (.)
13:50:59 <lambdabot> Functor f => (b -> c) -> f (a -> b) -> f (a -> c)
13:51:42 <Solid> Tisoxin: if they're learning colemak-dh then they've already found something "better" than the ones you listed :>
13:52:37 <Tisoxin> uh
13:52:41 <Tisoxin> i missed the dh
13:54:03 <Tisoxin> :/
13:54:38 <Tisoxin> Solid: Maybe 3l is interesting for them
13:54:45 <Tisoxin> Since it has additional layers
13:55:16 <Solid> it looks pretty cool
13:55:32 <Solid> but probably the worst thing to do when you've been learning a layout for 5 days is to switch to a new weird one :D
13:55:49 <Tisoxin> :]
13:55:58 <Tisoxin> there are worse things
13:56:08 <Tisoxin> e.g. switching after a few weeks (like i did)
13:56:35 <Tisoxin> Solid: Which layout are you using?
13:56:51 <Tisoxin> afaik it's pretty common for german programmers to use qwerty
13:57:38 <Solid> I mean, it's pretty common for programmers (and, really, people) to use qwerty in general :)
13:57:44 <Solid> I also use colemak-dh right now
13:58:19 <Solid> my wrist problems disappeared and I'm reasonably fast, so probably not worth trying out more layouts
13:58:48 <Tisoxin> yes
14:01:16 <Tisoxin> Maybe I'll switch one day to a layout, thats suits english better
14:02:00 <Tisoxin> and the 5th and 6th layer of my current layout are pretty useless as well
14:02:03 <Tisoxin> I'd change them
14:37:38 ThisGuyFucks joins (~ThisGuyFu@49.36.233.220)
14:45:40 × ThisGuyFucks quits (~ThisGuyFu@49.36.233.220) (Quit: Client closed)
15:18:37 <contrapunctus> Oh, so for some reason when I type `kmonad myconfig.kbd` and hit Enter at the terminal, Enter is "stuck" and triggered indefinitely until I press something else 🤔️
16:23:39 <Tisoxin> contrapunctus: I have the same „problem“
16:24:38 <Tisoxin> I'm not sure why it's happening, maybe kmonad just discards the first keyrelease, since there is no associated keypress for it
16:25:06 <Tisoxin> and then a program higher up the stuck just repeats the keypress
16:25:13 <Tisoxin> *stack not stuck
16:30:51 <Tisoxin> E.g. Xorg
16:35:56 <Solid> if the keyboard is captured before the release event is send to the system, then we can't send a release event because the keyboard that kmonad created is not the same as the original
16:36:18 <Solid> and linux is smart enough to figure out that the release event comes from two different devices
16:37:00 <Solid> the fix is to do something like `sleep 1 && kmonad ...`
16:37:35 <Solid> $HEAD should do this automatically
16:37:57 <Tisoxin> HEAD?
16:38:02 <Solid> the git version
16:38:22 <Tisoxin> ah
16:38:41 <Tisoxin> all the times its started?
16:39:33 <Tisoxin> Or is there a check wether it got interactively invoked or not?
16:40:47 <Solid> afaik it's there all the time
16:41:17 <Solid> (300ms by default or something)
16:41:19 <Solid> but it's configurable via the config file at least
16:41:30 <Tisoxin> ok
16:41:42 <Solid> ah and with a CL argument as well
16:41:48 <Solid> -w or --start-delay
16:42:03 <Tisoxin> yes its 300ms
19:23:59 <contrapunctus> I wrote a gemlog post about kmonad. gemini://tilde.team/~contrapunctus/gemlog/keyboard-machinations-kmonad.gmi
19:24:39 <contrapunctus> (If you don't have a Gemini client, see https://tilde.team/~contrapunctus )
19:25:40 <Tisoxin> Do you know System Crafters?
19:27:10 <Tisoxin> apart from that: lol, now i know two musicians, that enjoy programming
19:28:38 <contrapunctus> Tisoxin: Never heard of System Crafters...what about them? :)
19:29:17 <Tisoxin> It's an youtube channel, mainly about emacs, but he made a video about gemini as well
19:29:37 <Tisoxin> That's why wondered, whether you were inspired by him to use Gemini
19:31:54 <Tisoxin> „small-yet-active community“
19:31:57 <Tisoxin> :]
19:32:40 <Tisoxin> It's more or less just Solid and me, the other guys are either inactive or on discord
19:37:16 <Tisoxin> nice blog post
19:39:09 <contrapunctus> thanks :) really glad to have found this tool and for the help in getting it up. The possibilities are really exciting.
19:39:48 <Tisoxin> yes (though it the config language could be better)
19:39:51 <Solid> The plan still is to bridge to discord (sigh) at some point
19:39:57 <Solid> which may make this place more lively
19:40:04 SomeRandomDude joins (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7)
19:40:10 <SomeRandomDude> hello
19:40:14 <Tisoxin> hi
19:40:23 <SomeRandomDude> can somebody help me with installation?
19:40:38 <SomeRandomDude> i install the kmonad-bin packaged
19:40:45 <SomeRandomDude> what do i do now?
19:40:46 <Tisoxin> i guess
19:40:47 <Tisoxin> i can
19:41:13 <Tisoxin> Which OS are you using?
19:41:16 <SomeRandomDude> arch
19:41:36 <SomeRandomDude> i have a kmonad config for colemak dh
19:42:05 <SomeRandomDude> i dont know where to place the kmonad scripts
19:42:17 <Tisoxin> Well then you should be able to use kmonad with `kmonad $CONFIGFILE`
19:42:49 <SomeRandomDude> without running the services?
19:43:06 <SomeRandomDude> like theres the run file and the kmonad.service file given
19:43:16 <Tisoxin> Solid: I'm still sceptical, if bridging wouldn't just kill this community
19:43:28 <Tisoxin> hm
19:44:04 <Tisoxin> If you use the systemd service, the location of the file should be described in the installation explanation™
19:45:18 <SomeRandomDude> yeah the run file in asked to be in /etc/sv/kmonad
19:45:24 <SomeRandomDude> but what about the .service file
19:46:29 <Tisoxin> I guess just your standard systemd directory
19:46:37 <Tisoxin> But i use NixOS, so i can't help you any further
19:47:03 <Tisoxin> https://wiki.archlinux.org/title/Systemd#Writing_unit_files
19:47:24 <Solid> SomeRandomDude: the run file is in case you use the runit init system
19:47:31 <Solid> you don't need it with systemd
19:47:48 <SomeRandomDude> ohh
19:48:00 <Tisoxin> You probably should place the service file in the directory `/usr/lib/systemd/system/`
19:48:16 <SomeRandomDude> oh
19:49:54 <Solid> Tisoxin: "kill" in what sense?
19:50:10 <SomeRandomDude> also about this
19:50:11 <SomeRandomDude> Make sure the uinput device file has the right permissions: Add a udev rule (in either /etc/dev/rules.d or /lib/udev/rules.d) with the following content:
19:50:12 <SomeRandomDude> KERNEL=="uinput", MODE="0660", GROUP="uinput", OPTIONS+="static_node=uinp
19:50:21 <SomeRandomDude> do i just make a random file name or is there a syntax
19:51:02 <Solid> afaik there has to be a .rules suffix
19:51:12 <Solid> but other than that you should be able to name it anything you want
19:51:21 <SomeRandomDude> oh thanks
19:52:03 <Tisoxin> Solid: Like maybe, „come on the discord, we already talked about this here and there“
19:52:08 <Tisoxin> But I donno
19:52:13 <Solid> ah I see
19:52:32 <Tisoxin> Maybe It's just that i hate discord and i'm much to subjective on this matter
19:52:37 <Tisoxin> ¯\_(ツ)_/¯
19:52:49 <Solid> can't have enough hate for discord really :P
19:57:50 <SomeRandomDude> do i make a new rules file?
19:57:59 <SomeRandomDude> i dont wanna fuck things up
19:58:03 <SomeRandomDude> :/
19:58:26 <Tisoxin> (obligatoric NixOS Advertise)
19:58:33 <Tisoxin> :p
19:58:38 <Solid> both options are fine
19:58:50 <Solid> if you already have a rules file that all input rules reside in just add it there
19:58:57 <Solid> if not then making a new file works as well
19:59:25 <SomeRandomDude> well there are lots of rules file in the /lib/udev/rules.d dir
19:59:34 <SomeRandomDude> but idk whats the right one
19:59:52 <SomeRandomDude> maybe the udev-defaults
19:59:54 <Tisoxin> then just add a new one
20:01:05 <SomeRandomDude> ok i added the file im gonna restart
20:01:10 <SomeRandomDude> i will come back in 2 mins
20:01:13 × SomeRandomDude quits (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7) (Quit: Client closed)
20:02:49 SomeRandomDude joins (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7)
20:02:56 <SomeRandomDude> hmm
20:03:09 <SomeRandomDude> its still showing permission denies
20:03:34 <Tisoxin> have added your user to the uinput and input group?
20:03:39 <SomeRandomDude> yeah
20:03:53 <SomeRandomDude> d
20:04:29 <SomeRandomDude> kmonad /dev/input/by-path/kdfjkd-kbd openFd permission denied
20:09:22 <Tisoxin> SomeRandomDude: Maybe try starting kmonad with verbose logging
20:09:28 <Tisoxin> (on the command line)
20:12:46 <SomeRandomDude> how to do that?
20:13:10 <SomeRandomDude> what value to pass in -l flag
20:13:40 <Tisoxin> i'm not sure, i don't actually have kmonad installed…
20:13:43 Tisoxin runs
20:14:04 <Tisoxin> hm
20:14:12 <Tisoxin> use debug
20:15:46 <SomeRandomDude> Opening KeySink
20:15:46 <SomeRandomDude> Registering Uinput device
20:15:47 <SomeRandomDude> Opening KeySource
20:15:47 <SomeRandomDude> Closing KeySink
20:15:48 <SomeRandomDude> Unregistering Uinput device
20:15:48 <SomeRandomDude> Closing Uinput device file
20:15:49 <SomeRandomDude> kmonad: /dev/input/by-path/platform-i8042-serio-0-event-kbd: openFd: permission denied (Permission denied)
20:16:10 × SomeRandomDude quits (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7) (Quit: Client closed)
20:16:45 SomeRandomDude joins (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7)
20:17:59 <SomeRandomDude> so i tried running kmonad.service file through systemd
20:18:07 <SomeRandomDude> it still does not work :(
20:18:29 <Tisoxin> do you get the same output, if you run it with your user?
20:18:34 <Tisoxin> *when
20:19:10 <Tisoxin> apart from that, are you sure you are in the uinput and input group?
20:19:24 <Tisoxin> (check with the `group` command, without sudo)
20:19:42 <Tisoxin> (not the `group` but the `groups` command)
20:20:39 <SomeRandomDude> i have only added myself to uinput group
20:20:50 <SomeRandomDude> is the input group required too?
20:20:59 <Tisoxin> yes
20:21:10 <SomeRandomDude> ohk i will make it
20:22:06 <Tisoxin> i guess the installation documentation is insufficient
20:22:12 <Tisoxin> sigh
20:22:47 <SomeRandomDude> yeah
20:22:52 <SomeRandomDude> its still showing the same thing
20:22:56 <SomeRandomDude> permission denied
20:23:04 <Tisoxin> did you reboot?
20:23:07 <Tisoxin> i think you need to
20:23:13 <Tisoxin> though i'm not sure
20:23:25 <Tisoxin> does `groups` show uinput as well as input?
20:23:43 <SomeRandomDude> groups shows only uinput
20:23:52 <Tisoxin> then you need to reboot
20:23:59 <Tisoxin> or relog
20:24:03 <SomeRandomDude> ok i will be back
20:24:08 × SomeRandomDude quits (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7) (Quit: Client closed)
20:27:06 SomeRandomDude joins (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7)
20:27:11 <SomeRandomDude> Hey Im Back
20:27:19 <SomeRandomDude> It works now
20:27:26 <Tisoxin> nice
20:27:31 <SomeRandomDude> thanks for helping
20:27:39 <SomeRandomDude> :)
20:27:45 <Tisoxin> np
20:29:44 Tisoxin sighs in Haskell Confusion
20:31:12 <Solid> this does not really seem haskell related
20:31:29 <Solid> (and if the install instructions are wrong please pr a fix :))
20:31:31 <Tisoxin> yes
20:32:00 <Tisoxin> I think the problem is, that there is, that the systmd file is not actually documented
20:32:17 <Solid> ah I see
20:32:23 <Tisoxin> My haskell confusion is also not rooted in their problem
20:33:00 <Tisoxin> i'm currently reading the typeclassopedia
20:33:23 <Tisoxin> „((.) ($ f) (flip ($)))“
20:34:19 <Solid> lol
20:35:51 <Tisoxin> the flip ($) is the worst
20:36:13 <Tisoxin> though alone it's still comprehensible
20:36:19 <Tisoxin> but in combination with (.)…
20:40:50 <Solid> x)
20:40:56 <Solid> (&) reads a bit nicer than flip ($)
20:41:15 <Solid> @pointful ((.) ($ f) (flip ($)))
20:41:15 <lambdabot> f
20:41:21 × SomeRandomDude quits (~SomeRando@2405:201:5c04:f137:3452:dd96:e675:9a7) (Quit: Client closed)
20:41:23 <Tisoxin> one could also write ↑
20:41:24 <Solid> oh that's prety neat
20:41:28 <Tisoxin> :D
20:42:15 <Tisoxin> I tried to prove „pure f <*> x = pure (flip ($)) <*> x <*> pure f“
20:43:01 <Tisoxin> * `pure f <*> x = pure (flip ($)) <*> x <*> pure f`
20:44:51 <Solid> looks true
20:45:05 <Tisoxin> it is
20:45:56 <Tisoxin> Why did i even use those Applicative laws
20:45:58 <Tisoxin> ._.
20:46:14 <Tisoxin> If i look at it, its pretty obviously true
20:46:27 <Solid> :D
20:46:54 <Tisoxin> well, the more you learn…
20:47:00 <Solid> It may also be easier to look at `pure ($) <*> pure f <*> x` instead of wrapping your head around flip
20:47:22 <Solid> well actually
20:47:26 <Tisoxin> yes, but that was the exercise…
20:47:37 <Tisoxin> * not the exercise
20:47:46 <Solid> let's just do `($) <$> pure f <*> x` to really make it clear
20:48:40 <Tisoxin> or `f <$> x` :>
20:48:44 <Solid> :D
20:49:21 <Tisoxin> sometimes, haskell is great at doing easy things complicated
20:50:26 <Tisoxin> though that particular example wasn't exactly haskells fault
20:51:19 <Tisoxin> But that's just the trade-off from having high abstractions i suppose
20:52:33 <Solid> I mean if you ever see someone trying to define f as ((.) ($ f) (flip ($))) then please slap that person :D
20:53:16 <Solid> but yeah these are just exercises to familiarise you with the laws for these functors
20:53:32 <Solid> don't worry, you'll forget them in a few days :P
20:53:46 <Tisoxin> :]
20:53:57 <Tisoxin> <Solid "I mean if you ever see someone t"> i will, i will
20:55:07 Tisoxin will use somewhere in his next haskell project ((.) ($ f) (flip ($))) instead of f :>
20:55:30 <Solid> x)
21:08:28 <Tisoxin> <Tisoxin "sometimes, haskell is great at d"> on a second thought, that's not really true
21:08:42 <Tisoxin> since the complicated bits are also the abstract ones
21:10:14 <Tisoxin> and abstraction is often intuitive but most of the time hard to understand completely

All times are in UTC on 2021-07-22.