') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Don't use braces in `fgl.cabal` to allow building with MicroHs by konsumlamm · Pull Request #116 · haskell/fgl · GitHub
Skip to content

Don't use braces in fgl.cabal to allow building with MicroHs - #116

Merged
athas merged 1 commit into
haskell:masterfrom
konsumlamm:patch-1
Dec 22, 2025
Merged

Don't use braces in fgl.cabal to allow building with MicroHs#116
athas merged 1 commit into
haskell:masterfrom
konsumlamm:patch-1

Conversation

@konsumlamm

Copy link
Copy Markdown
Contributor

MicroHs: https://github.com/augustss/MicroHs

I can add a MicroHs action to the CI if you want, but it might either become outdated (if we pin the MicroHs version) or fail sometimes (when using the latest version). In any case, I also plan to build fgl in the MicroHs CI.

@athas

Copy link
Copy Markdown
Contributor

I did not even know that cabal supported braces. I'm more of a custodian than a real maintainer, but I see no reason not to do this.

Is it possible to remove braces via a Hackage revision? It seems a little awkward to do an entire release just for this.

@konsumlamm

Copy link
Copy Markdown
ContributorAuthor

Is it possible to remove braces via a Hackage revision? It seems a little awkward to do an entire release just for this.

It should be possible, however I'm not sure if MicroCabal actually considers revisions. cc @augustss
This isn't urgent though, so I wouldn't mind waiting a bit for a new release until enough changes have accumulated.

@augustss

Copy link
Copy Markdown

MicroCabal ignores version numbers. It uses a consistent set of packages as defined by Stackage.

@konsumlamm

konsumlamm commented Dec 22, 2025

Copy link
Copy Markdown
ContributorAuthor

MicroCabal ignores version numbers. It uses a consistent set of packages as defined by Stackage.

But which .cabal file does it use? The one that was originally uploaded or the revised version?
For context: The issue here is that MicroCabal can't parse the current .cabal file.

@augustss

Copy link
Copy Markdown

It uses the version number obtained from stackage to form the URL for download from Hackage.

I think we can tweak the MicroCabal parser to accept braces.

@konsumlamm

Copy link
Copy Markdown
ContributorAuthor

It uses the version number obtained from stackage to form the URL for download from Hackage.

If I understand correctly, that means that it doesn't use the revised .cabal file, so a revision wouldn't fi the problem.

@athas

Copy link
Copy Markdown
Contributor

I think Stackage includes revisions.

@athas

Copy link
Copy Markdown
Contributor

I don't know why CI will not run, but this change is obviously harmless.

@athas
athas merged commit 1eae453 into haskell:masterDec 22, 2025
0 of 11 checks passed
@Bodigrim

Copy link
Copy Markdown

I think we can tweak the MicroCabal parser to accept braces.

Even Cabal proper would rather not to deal with brace syntax, so cleaning them up is a good thing anyway.

@konsumlamm
konsumlamm deleted the patch-1 branch December 23, 2025 10:51
@konsumlamm

Copy link
Copy Markdown
ContributorAuthor

It uses the version number obtained from stackage to form the URL for download from Hackage.

If I understand correctly, that means that it doesn't use the revised .cabal file, so a revision wouldn't fi the problem.

MicroCabal unfortunately still uses the old .cabal file, however installing via git now works. Thanks!

Sign up for freeto 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.

4 participants

@konsumlamm@athas@augustss@Bodigrim