Skip to content

Instantly share code, notes, and snippets.

Avatar
🌮

Profpatsch

🌮
View GitHub Profile
@Profpatsch
Profpatsch / string-builder.nix
Created Nov 19, 2022
“Efficient” string builder in nix
View string-builder.nix
let
list =
rec {
empty = { a = null; cons = null; };
singleton = x: { a = x; cons = null; };
cons = x: xs: { a = x; cons = xs; };
# O(n)
foldr = f: zero:
@Profpatsch
Profpatsch / Pretty.hs
Created Nov 10, 2022
pretty-printing haskell `Show`able types with nicify-lib and hscolour
View Pretty.hs
{-# LANGUAGE LambdaCase #-}
module Pretty
( -- * Pretty printing for error messages
Err,
printPretty,
-- constructors hidden
prettyErrs,
message,
messageString,
@Profpatsch
Profpatsch / v0.0.1.nix
Created Oct 25, 2022
nixos options json schema
View v0.0.1.nix
let
pkgs = import ./. {};
lib = pkgs.lib;
allOptions = (import ./nixos {}).options;
depot = import /home/philip/depot {};
optionSchema = opt: {
type = simpletype opt;
description = opt.description.text or "";
@Profpatsch
Profpatsch / Permissions.hs
Created Jul 16, 2022
A simple record-based capability system in Haskell
View Permissions.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
@Profpatsch
Profpatsch / hlint-to-github-warnings.jq
Created Jun 21, 2022
Convert hlint warnings to github Action “smart” log messages
View hlint-to-github-warnings.jq
# the github message format requires newlines to be escaped with the URL-style %0A
# see https://github.com/actions/toolkit/issues/193#issuecomment-605394935
def escapeNewline: gsub("[\\n]"; "%0A");
# depending on the hlint message, we want to display the
# headings and the bodies differently
def prepareTitle:
if .hint == "Unused LANGUAGE pragma"
then { heading: "Unused LANGUAGE pragma: \(.from)"
, suggestion: ""
@Profpatsch
Profpatsch / with.fish
Created Feb 10, 2022
Add a package from nixpkgs to your current fish shell
View with.fish
function with --description 'import all arguments as nixpkgs args and put their /bin on PATH'
set arg ( \
printf '
let pkgs = import <nixpkgs> {};
in pkgs.symlinkJoin {
name = "extra-fish-path";
paths = with pkgs; [ %s ];
}
' \
"$argv" \
@Profpatsch
Profpatsch / Incidence.hs
Created Nov 14, 2021
How many people do you have to meet to have a 50% chance somebody has Covid at an incidence of 500 (in 100k people)
View Incidence.hs
module Main where
import System.Random
import Data.Ratio
import Data.Bifunctor
-- | Returns for a bunch of people you meet , with a chance of 1/200 for each person, whether any has Covid
randomPeople200 :: (RandomGen gen) => Int -> gen -> (Bool, gen)
randomPeople200 numberOfPeople =
first anyHasCovid . runGeneratorNTimes numberOfPeople 0 (uniformR (1, 200::Int))
@Profpatsch
Profpatsch / 1_encoding_sum_types_in_json-schema.md
Last active Oct 27, 2021
Encoding sum types with json-schema
View 1_encoding_sum_types_in_json-schema.md

The goal is to express an ADT like the following in json schema:

data Sum 
  = Foo { hi :: Int }
  | Bar { x :: Bool }

or in rust syntax:

@Profpatsch
Profpatsch / BitString.hs
Last active Jul 27, 2021
dumb BitString wrapper around ByteString that allows to slice it on bits
View BitString.hs
{-# LANGUAGE TypeApplications, ExplicitForAll, ScopedTypeVariables, BinaryLiterals, NumericUnderscores, TupleSections, ExistentialQuantification, KindSignatures, DataKinds, MultiWayIf, TypeFamilies, ConstraintKinds, TypeOperators, DerivingStrategies, GeneralizedNewtypeDeriving, InstanceSigs, MultiParamTypeClasses, FlexibleInstances #-}
module Main where
import qualified Data.Bits as Bits
import Data.Word
import qualified Data.List as List
import qualified Data.Text as Text
import qualified Data.ByteString as Bytes
import Data.ByteString (ByteString)
@Profpatsch
Profpatsch / .hlint.yaml
Last active Jul 19, 2022
hlint, the helpful parts
View .hlint.yaml
# HLint configuration file
# https://github.com/ndmitchell/hlint
# Run `hlint --default` to see the example configuration file.
##########################
# Ignore some builtin hints
# often functions are more readable with explicit arguments
- ignore: { name: Eta reduce }