Skip to content

Instantly share code, notes, and snippets.

View chrisdone-artificial's full-sized avatar

Chris Done chrisdone-artificial

View GitHub Profile
@chrisdone-artificial
chrisdone-artificial / Demo.hs
Created July 14, 2026 14:13
Lift instance for StaticPtr
{-# LANGUAGE TemplateHaskell #-}
import StaticNamed
import GHC.StaticPtr
xref :: StaticPtr Int
xref = $$( [|| static 12345678910 ||] )
yref :: StaticPtr Int
yref = $$( [|| static 987654321 ||] )
date 2026-04-23
title Some updates about Hell in 2026

I've added a few neat bits and bobs to Hell since I last blogged about it.

On the API side, things have slowed down when compared with the prior year,[^1] but other improvements were still made.

@chrisdone-artificial
chrisdone-artificial / auto-follow.user.js
Created March 4, 2026 14:25
Auto-follow Slack links
// ==UserScript==
// @name Auto-follow Slack links
// @version 1
// @match https://artificial.slack.com/*
// @grant none
// ==/UserScript==
setInterval(() => {
document.querySelectorAll('a').forEach((a) => {
if (a.innerText == 'open this link in your browser') {
@chrisdone-artificial
chrisdone-artificial / script.user.js
Last active March 3, 2026 13:11
Slack->Todoist GreaseMonkey script
// ==UserScript==
// @name Slack->Todoist
// @version 1
// @match https://app.slack.com/*
// ==/UserScript==
const timer = setInterval(() => {
const containers = Array.from(document.querySelectorAll(`div[data-qa="message_container"]:not([${TAG}])`));
if (containers.length == 0) {
} else {
{-# LANGUAGE KindSignatures, BlockArguments #-}
{-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-}
import Data.Kind
import Data.Functor.Const
import Control.Monad.Free
import Control.Applicative.Free
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import Data.Functor.Identity
import Data.ByteString (ByteString)
{-# LANGUAGE KindSignatures, BlockArguments #-}
{-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-}
import Data.Kind
import Data.Coerce
import Data.Functor.Const
import Control.Monad.Free
import Control.Applicative.Free
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import Data.Functor.Identity
{-# LANGUAGE KindSignatures, BlockArguments #-}
{-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-}
import Control.Monad.Free
import Control.Applicative.Free
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import Data.Functor.Identity
import Data.ByteString (ByteString)
import qualified Data.Map as Map
import Data.Map (Map)
{-# LANGUAGE KindSignatures #-}
{-# language GADTs, LambdaCase, GeneralizedNewtypeDeriving #-}
import Control.Monad.Free
import Control.Applicative.Free
import qualified Data.ByteString as S
import qualified Data.ByteString.Char8 as S8
import Data.Functor.Identity
import Data.ByteString (ByteString)
import qualified Data.Map as Map
import Data.Map (Map)
@chrisdone-artificial
chrisdone-artificial / liquid haskell.hs
Created January 3, 2026 16:26
free/alloc M but no cigar
-- needs to be a `M i o a', but almost there. LH is difficult (bad docs, bad errors, changing syntax)
{-# LANGUAGE GADTs #-}
{-# OPTIONS_GHC -fplugin=LiquidHaskell #-}
{-# language GeneralizedNewtypeDeriving, DeriveFunctor #-}
{-@ LIQUID "--prune-unsorted" @-}
import Control.Monad.State
import Data.Set qualified as Set
@chrisdone-artificial
chrisdone-artificial / liquid haskelld.hs
Last active January 2, 2026 12:42
read file, liquid haskell'd
{-# OPTIONS_GHC -fplugin=LiquidHaskell #-}
{-# language OverloadedStrings, BangPatterns #-}
import Data.Word
import Foreign.Ptr
import Foreign.C.Types
import Foreign.Marshal.Alloc
import System.Posix.IO.ByteString
import System.Posix.Types
main :: IO ()