Skip to content

adding whole-project loading - #5002

Merged
fendor merged 3 commits into
haskell:masterfrom
Saizan:hie-bios-0.20
Jul 30, 2026
Merged

adding whole-project loading#5002
fendor merged 3 commits into
haskell:masterfrom
Saizan:hie-bios-0.20

Conversation

@Saizan

@Saizan Saizan commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Updates hls to hie-bios 0.21 and takes advantage of its new LoadMode to add "whole project" components loading: loads all components specified in the cradle from the start, regardless of which files are open.

TODO:

  • Updated docs in doc/configuration.md
  • Add tests

@Saizan
Saizan force-pushed the hie-bios-0.20 branch 2 times, most recently from d0b01cc to b29e37a Compare July 5, 2026 11:27
@Saizan
Saizan marked this pull request as ready for review July 5, 2026 11:27
@Saizan

Saizan commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

@fendor let me know if you have a better field name than componentsLoading

Comment on lines -45 to 46
<*> o .:? "sessionLoading" .!= sessionLoading defValue
<*> loadingPref o
<*> o .:? "linkSourceTo" .!= linkSourceTo defValue

@Kleidukos Kleidukos Jul 6, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should definitely not deprecate sessionLoading without warning first. :) Happy to make sure that the next HLS announcement on the Haskell blog includes it.

@fendor

fendor commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Can we open an issue proposing what the changes to HLS are?

@fendor fendor left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes look good to me, primarily a question of UX and naming

Comment thread hls-plugin-api/src/Ide/Types.hs Outdated
@Saizan

Saizan commented Jul 7, 2026

Copy link
Copy Markdown
Contributor Author

Created issue #5005 to document design

@Saizan
Saizan requested a review from fendor July 7, 2026 10:22

@Kleidukos Kleidukos left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good work so far @Saizan, I'm seeing a couple of things that I'd like you to clarify:

  1. There seems to be both needed-only and only-needed, is that desired? We should probably stick with multi: needed-only.

  2. You seem to have introduced the double usage of multipleComponents (full words, plural) and multiComponent (abbreviated, singular). Please stay with multipleComponents:

              [ show @String old_value ++ " (deprecated)"
        ==>   | old_value <- ["singleComponent","multiComponent"]
              ]
  1. I feel like there is a similar disparity between "session loading" and "component loading" but maybe I'm wrong?

@Saizan

Saizan commented Jul 7, 2026

Copy link
Copy Markdown
Contributor Author

@Kleidukos thanks for catching that, decided to give a name to these strings, see last commit.

@Saizan
Saizan requested a review from Kleidukos July 13, 2026 14:54
@Kleidukos

Copy link
Copy Markdown
Member

@Saizan Do you know if we can expect an increase in memory consumption when enabling this feature? Would you mind sharing memory profiles before / after your patch? Not a blocker but this could certainly bring light on stuff we could work on afterwards. :)

@Saizan

Saizan commented Jul 13, 2026

Copy link
Copy Markdown
Contributor Author

@Kleidukos you mean compared to multi: needed-only but when we actually need the whole project, or something else?

Or would you like to know how much memory extra "unneeded" components amount to?

I would assume it's going to be fairly dependent on their composition, do you have a project in mind we could take as a benchmark? Otherwise I suppose the natural choice is HLS itself.

@Kleidukos

Copy link
Copy Markdown
Member

@Saizan Starting with HLS itself is not a bad choice at all! Basically what I'm interested in is what the average end-user can expect in terms of resource consumption after upgrading, with a project that has multiple packages.

Or would you like to know how much memory extra "unneeded" components amount to?

Something like this, yes. Basically if you have a workflow of "navigating a codebase with multiple components / packages in a project, what does that change for the end-user in terms of reactivity and does that blow up their memory usage". :)

@Saizan

Saizan commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

Here's some measurements.

Too avoid anything too complicated I ran $hls typecheck --log-file $log_file $FILES +RTS -s$stats_file for a few different sets of files and for two versions of $hls:

  • hls-needed-only: hls as of this PR
  • hls-whole-project: same but with componentsLoading defaulting to multi: whole-project.

Each time I set $HIE_BIOS_CACHE_DIR to a fresh temp dir and ran the command twice, to get results with and without cached on disk dependencies.

TLDR: memory can differ by ~1-2GB, either can come up on top.

Excluded targets

To avoid the cabal repl bug with build-tool-depends I excluded any targets with a build-tool-depends field:

- haskell-language-server:bench:benchmark
- haskell-language-server:test:func-test
- haskell-language-server:test:ghcide-bench-test
- haskell-language-server:test:ghcide-tests
- haskell-language-server:test:wrapper-test

To make sure whole-project was not going pick these up I added a hie.yaml file with a componentsLoad field listing all the other targets. The field is new in hie-bios-0.20, as an easy way to customize what whole-project loading should actually load.

cradle:
  cabal:
    componentsToLoad:
      - ghcide:exe:ghcide
      - ghcide:lib:ghcide
      ...

Results

All Files

Here $FILES is set to all files from units that were not excluded.

hls-needed-only

First run

  92,637,849,856 bytes allocated in the heap
  14,584,992,688 bytes copied during GC
   3,548,378,128 bytes maximum residency (9 sample(s))
      60,292,080 bytes maximum slop
            7614 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       654 colls,     0 par   11.414s  11.704s     0.0179s    0.2741s
  Gen  1         9 colls,     0 par    8.811s   8.843s     0.9826s    3.4077s

  TASKS: 8 (1 bound, 7 peak workers (7 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.003s  (  0.003s elapsed)
  MUT     time   37.296s  (154.625s elapsed)
  GC      time   20.225s  ( 20.548s elapsed)
  EXIT    time    0.002s  (  0.001s elapsed)
  Total   time   57.526s  (175.176s elapsed)

  Alloc rate    2,483,839,289 bytes per MUT second

  Productivity  64.8% of total user, 88.3% of total elapsed

Second run

  76,078,038,512 bytes allocated in the heap
  10,848,946,096 bytes copied during GC
   2,432,899,128 bytes maximum residency (8 sample(s))
      50,010,056 bytes maximum slop
            4873 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       535 colls,     0 par    9.461s   9.463s     0.0177s    0.0819s
  Gen  1         8 colls,     0 par    4.684s   4.685s     0.5856s    2.0822s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.002s elapsed)
  MUT     time   27.996s  (104.375s elapsed)
  GC      time   14.145s  ( 14.148s elapsed)
  EXIT    time    0.011s  (  0.010s elapsed)
  Total   time   42.153s  (118.534s elapsed)

  Alloc rate    2,717,505,865 bytes per MUT second

  Productivity  66.4% of total user, 88.1% of total elapsed

hls-whole-project

First run

  73,493,414,640 bytes allocated in the heap
   9,929,643,872 bytes copied during GC
   2,246,301,640 bytes maximum residency (8 sample(s))
      41,547,832 bytes maximum slop
            4376 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       518 colls,     0 par    8.250s   8.252s     0.0159s    0.0618s
  Gen  1         8 colls,     0 par    3.933s   3.934s     0.4918s    1.9401s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.003s  (  0.003s elapsed)
  MUT     time   25.821s  ( 58.997s elapsed)
  GC      time   12.183s  ( 12.186s elapsed)
  EXIT    time    0.012s  (  0.011s elapsed)
  Total   time   38.020s  ( 71.197s elapsed)

  Alloc rate    2,846,286,978 bytes per MUT second

  Productivity  67.9% of total user, 82.9% of total elapsed

Second run

  83,057,909,288 bytes allocated in the heap
  10,541,334,720 bytes copied during GC
   2,231,365,416 bytes maximum residency (8 sample(s))
      41,439,448 bytes maximum slop
            4520 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       587 colls,     0 par    8.992s   8.995s     0.0153s    0.0824s
  Gen  1         8 colls,     0 par    4.107s   4.108s     0.5135s    2.0226s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.002s elapsed)
  MUT     time   28.688s  ( 30.276s elapsed)
  GC      time   13.099s  ( 13.103s elapsed)
  EXIT    time    0.002s  (  0.001s elapsed)
  Total   time   41.792s  ( 43.382s elapsed)

  Alloc rate    2,895,172,557 bytes per MUT second

  Productivity  68.6% of total user, 69.8% of total elapsed

hls-plugin-api files

hls-needed-only

First run

   4,211,721,248 bytes allocated in the heap
   1,008,933,168 bytes copied during GC
     283,311,320 bytes maximum residency (6 sample(s))
       6,533,928 bytes maximum slop
             620 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0        25 colls,     0 par    0.697s   0.697s     0.0279s    0.0712s
  Gen  1         6 colls,     0 par    0.535s   0.535s     0.0892s    0.2252s

  TASKS: 6 (1 bound, 5 peak workers (5 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.001s elapsed)
  MUT     time    1.594s  ( 11.670s elapsed)
  GC      time    1.232s  (  1.233s elapsed)
  EXIT    time    0.001s  (  0.001s elapsed)
  Total   time    2.829s  ( 12.904s elapsed)

  Alloc rate    2,641,606,547 bytes per MUT second

  Productivity  56.4% of total user, 90.4% of total elapsed

Second run

   4,214,356,008 bytes allocated in the heap
     982,361,304 bytes copied during GC
     283,761,608 bytes maximum residency (6 sample(s))
       6,526,008 bytes maximum slop
             609 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0        25 colls,     0 par    0.670s   0.670s     0.0268s    0.0707s
  Gen  1         6 colls,     0 par    0.536s   0.536s     0.0893s    0.2281s

  TASKS: 6 (1 bound, 5 peak workers (5 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.002s elapsed)
  MUT     time    1.561s  (  2.127s elapsed)
  GC      time    1.205s  (  1.206s elapsed)
  EXIT    time    0.001s  (  0.001s elapsed)
  Total   time    2.769s  (  3.335s elapsed)

  Alloc rate    2,700,268,418 bytes per MUT second

  Productivity  56.4% of total user, 63.8% of total elapsed

hls-whole-project

First run

  32,718,057,560 bytes allocated in the heap
   3,546,706,672 bytes copied during GC
     877,073,736 bytes maximum residency (7 sample(s))
      25,877,176 bytes maximum slop
            1745 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       225 colls,     0 par    2.371s   2.372s     0.0105s    0.0696s
  Gen  1         7 colls,     0 par    1.354s   1.355s     0.1936s    0.5491s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.001s  (  0.001s elapsed)
  MUT     time    8.466s  ( 41.726s elapsed)
  GC      time    3.726s  (  3.727s elapsed)
  EXIT    time    0.001s  (  0.001s elapsed)
  Total   time   12.194s  ( 45.455s elapsed)

  Alloc rate    3,864,692,152 bytes per MUT second

  Productivity  69.4% of total user, 91.8% of total elapsed

Second run

  32,711,407,808 bytes allocated in the heap
   3,534,262,888 bytes copied during GC
     882,872,392 bytes maximum residency (7 sample(s))
      26,173,368 bytes maximum slop
            1751 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       225 colls,     0 par    2.373s   2.374s     0.0105s    0.0670s
  Gen  1         7 colls,     0 par    1.355s   1.355s     0.1935s    0.5913s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.002s elapsed)
  MUT     time    8.330s  (  9.758s elapsed)
  GC      time    3.727s  (  3.728s elapsed)
  EXIT    time    0.001s  (  0.001s elapsed)
  Total   time   12.060s  ( 13.488s elapsed)

  Alloc rate    3,926,907,067 bytes per MUT second

  Productivity  69.1% of total user, 72.3% of total elapsed

ghcide files

hls-needed-only

First run

  30,942,661,976 bytes allocated in the heap
   4,913,782,024 bytes copied during GC
     931,700,352 bytes maximum residency (9 sample(s))
      14,391,040 bytes maximum slop
            2411 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       214 colls,     0 par    3.694s   3.695s     0.0173s    0.0810s
  Gen  1         9 colls,     0 par    2.683s   2.683s     0.2982s    0.9984s

  TASKS: 9 (1 bound, 8 peak workers (8 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.003s  (  0.002s elapsed)
  MUT     time   12.699s  ( 31.471s elapsed)
  GC      time    6.377s  (  6.378s elapsed)
  EXIT    time    0.011s  (  0.010s elapsed)
  Total   time   19.088s  ( 37.861s elapsed)

  Alloc rate    2,436,715,689 bytes per MUT second

  Productivity  66.5% of total user, 83.1% of total elapsed

Second run

  22,268,864,096 bytes allocated in the heap
   3,842,714,904 bytes copied during GC
     966,309,152 bytes maximum residency (8 sample(s))
      14,154,464 bytes maximum slop
            2030 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       152 colls,     0 par    2.671s   2.672s     0.0176s    0.0672s
  Gen  1         8 colls,     0 par    2.107s   2.107s     0.2634s    0.9657s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.002s elapsed)
  MUT     time    8.400s  (  9.144s elapsed)
  GC      time    4.778s  (  4.780s elapsed)
  EXIT    time    0.056s  (  0.055s elapsed)
  Total   time   13.237s  ( 13.981s elapsed)

  Alloc rate    2,650,983,870 bytes per MUT second

  Productivity  63.5% of total user, 65.4% of total elapsed

hls-whole-project

First run

  47,764,737,240 bytes allocated in the heap
   6,180,688,496 bytes copied during GC
   1,567,969,008 bytes maximum residency (8 sample(s))
      39,215,376 bytes maximum slop
            3111 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       332 colls,     0 par    4.424s   4.425s     0.0133s    0.0568s
  Gen  1         8 colls,     0 par    2.705s   2.707s     0.3383s    1.2500s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.001s  (  0.001s elapsed)
  MUT     time   15.282s  ( 48.571s elapsed)
  GC      time    7.129s  (  7.132s elapsed)
  EXIT    time    0.003s  (  0.002s elapsed)
  Total   time   22.414s  ( 55.706s elapsed)

  Alloc rate    3,125,633,413 bytes per MUT second

  Productivity  68.2% of total user, 87.2% of total elapsed

Second run

  49,697,466,576 bytes allocated in the heap
   6,872,255,584 bytes copied during GC
   1,891,256,848 bytes maximum residency (8 sample(s))
      43,087,344 bytes maximum slop
            3726 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       346 colls,     0 par    4.589s   4.590s     0.0133s    0.0643s
  Gen  1         8 colls,     0 par    3.274s   3.274s     0.4093s    1.5916s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.001s  (  0.001s elapsed)
  MUT     time   15.673s  ( 17.063s elapsed)
  GC      time    7.863s  (  7.865s elapsed)
  EXIT    time    0.002s  (  0.001s elapsed)
  Total   time   23.539s  ( 24.930s elapsed)

  Alloc rate    3,170,881,833 bytes per MUT second

  Productivity  66.6% of total user, 68.4% of total elapsed

haskell-language-server files

hls-needed-only

First run

   2,266,315,160 bytes allocated in the heap
     725,178,320 bytes copied during GC
     258,351,904 bytes maximum residency (6 sample(s))
       6,929,632 bytes maximum slop
             596 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0        10 colls,     0 par    0.329s   0.329s     0.0329s    0.0639s
  Gen  1         6 colls,     0 par    0.581s   0.581s     0.0969s    0.2547s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.001s  (  0.001s elapsed)
  MUT     time    1.595s  (121.168s elapsed)
  GC      time    0.910s  (  0.910s elapsed)
  EXIT    time    0.001s  (  0.001s elapsed)
  Total   time    2.508s  (122.080s elapsed)

  Alloc rate    1,420,625,133 bytes per MUT second

  Productivity  63.6% of total user, 99.3% of total elapsed

Second run

   2,214,482,384 bytes allocated in the heap
     738,501,720 bytes copied during GC
     254,972,944 bytes maximum residency (6 sample(s))
       4,754,416 bytes maximum slop
             592 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0        10 colls,     0 par    0.335s   0.335s     0.0335s    0.0669s
  Gen  1         6 colls,     0 par    0.588s   0.588s     0.0980s    0.2571s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.001s  (  0.001s elapsed)
  MUT     time    1.454s  (  2.211s elapsed)
  GC      time    0.923s  (  0.923s elapsed)
  EXIT    time    0.001s  (  0.000s elapsed)
  Total   time    2.380s  (  3.136s elapsed)

  Alloc rate    1,522,610,184 bytes per MUT second

  Productivity  61.1% of total user, 70.5% of total elapsed

hls-whole-project

First run

  64,781,650,528 bytes allocated in the heap
   8,256,190,584 bytes copied during GC
   1,846,480,104 bytes maximum residency (9 sample(s))
      44,405,528 bytes maximum slop
            4179 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       453 colls,     0 par    7.238s   7.241s     0.0160s    0.0720s
  Gen  1         9 colls,     0 par    4.653s   4.654s     0.5171s    2.1497s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.001s  (  0.001s elapsed)
  MUT     time   28.340s  ( 61.055s elapsed)
  GC      time   11.890s  ( 11.895s elapsed)
  EXIT    time    0.002s  (  0.001s elapsed)
  Total   time   40.234s  ( 72.952s elapsed)

  Alloc rate    2,285,836,438 bytes per MUT second

  Productivity  70.4% of total user, 83.7% of total elapsed

Second run

  64,512,844,352 bytes allocated in the heap
   8,226,973,784 bytes copied during GC
   1,852,008,360 bytes maximum residency (9 sample(s))
      44,488,792 bytes maximum slop
            4170 MiB total memory in use (0 MiB lost due to fragmentation)

                                     Tot time (elapsed)  Avg pause  Max pause
  Gen  0       451 colls,     0 par    6.969s   6.972s     0.0155s    0.0950s
  Gen  1         9 colls,     0 par    4.500s   4.501s     0.5001s    1.5769s

  TASKS: 7 (1 bound, 6 peak workers (6 total), using -N1)

  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)

  INIT    time    0.002s  (  0.002s elapsed)
  MUT     time   25.652s  ( 27.403s elapsed)
  GC      time   11.469s  ( 11.473s elapsed)
  EXIT    time    0.002s  (  0.001s elapsed)
  Total   time   37.124s  ( 38.879s elapsed)

  Alloc rate    2,514,959,260 bytes per MUT second

  Productivity  69.1% of total user, 70.5% of total elapsed

@Saizan

Saizan commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

hls-numbers.tar.gz

Fulls logs and inputs in the tarball.

One thing to be careful about when testing is that shared libraries make it complicated to have both versions of hls live at once, so I recommend to first collect all your numbers for one version and then the other. Or I guess someone should add a --config flag to typecheck.

@fendor
fendor force-pushed the hie-bios-0.20 branch 2 times, most recently from cf271c1 to 80bf872 Compare July 30, 2026 15:45

@fendor fendor left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I applied some final tweaks, now I am happy with it!

Saizan and others added 3 commits July 30, 2026 20:05
renamed "sessionLoading" config to "componentsLoading"
deprecated old values in favor of: "single", "multi: needed-only", "multi: whole-project"

Upgrade to hie-bios 0.21.0.0
@fendor
fendor merged commit 421ad24 into haskell:master Jul 30, 2026
42 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants