Skip to content

Instantly share code, notes, and snippets.

View danidiaz's full-sized avatar

Daniel Díaz Carrete danidiaz

View GitHub Profile
{-# LANGUAGE LinearTypes #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE LambdaCase #-}
module Main where
import Data.Unrestricted.Linear (move, unur, Ur(..)) -- from linear-base
data R = R
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE OverloadedRecordDot #-}
import Control.Monad.State (State, execState, gets, modify, put, get)
import GHC.Records (HasField (..))
setField :: (HasField s a b) => b -> a -> a
@danidiaz
danidiaz / CaseOfKnownConstructor.hs
Last active October 29, 2023 08:56
Example of how the case-of-known-constructor can remove the use of a record
-- https://www.reddit.com/r/haskell/comments/170f6qa/comment/k6spn9n/
-- Compare the core of
-- ghc -O0 -c Main.hs -ddump-to-file -ddump-simpl -dsuppress-idinfo -dsuppress-coercions -dsuppress-type-applications -dsuppress-uniques -dsuppress-module-prefixes -fforce-recomp
-- with the core of
-- ghc -O2 -c Main.hs -ddump-to-file -ddump-simpl -dsuppress-idinfo -dsuppress-coercions -dsuppress-type-applications -dsuppress-uniques -dsuppress-module-prefixes -fforce-recomp
-- search for "foofun".
module Main (main) where
data Foo = Foo
{ aaa :: Int,
@danidiaz
danidiaz / FullLazinessPresumedWoes.hs
Created October 19, 2023 21:35
problems due to laziness
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE LambdaCase #-}
-- | https://well-typed.com/blog/2016/09/sharing-conduit/
module Main where
import Control.Exception
import System.IO
retry :: IO a -> IO a
retry io = do
@danidiaz
danidiaz / RecordUpdatePain.hs
Last active October 4, 2023 20:30
record update pain
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE RecordWildCards #-}
module Main where
import Distribution.Simple (KnownExtension(RecordWildCards))
data Foo = Foo {
aaa :: Int,
bbb :: Bool
-- code by mniip
types :: [String]
types = $(
do
insts <- reifyInstances ''Exception [VarT (mkName "a")]
let
tyConOf (AppT ty _) = tyConOf ty
tyConOf (ConT con) = Just con
tyConOf _ = Nothing
tyCons <- for insts \case
@danidiaz
danidiaz / ifd1.nix
Last active August 5, 2023 16:40
ifd
# https://nixos.wiki/wiki/Import_From_Derivation
# https://discourse.nixos.org/t/how-to-import-a-derivation-with-import/15375
# https://nixos.org/manual/nix/stable/language/builtins#builtins-import
# https://nixos.org/manual/nix/stable/language/values.html#type-string
let
pkgs = import <nixpkgs> {};
derivation-to-import = pkgs.writeText "inner" "5";
imported-nix-value = import derivation-to-import;
in pkgs.writeText "foo" ''
The value from the inner derivation was: ${toString imported-nix-value}
@danidiaz
danidiaz / main.tf
Last active March 26, 2023 22:13
Hetzner terraform file
# https://developer.hashicorp.com/terraform/language/providers/requirements
# https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli
terraform {
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
version = "1.36.2"
}
}
}
@danidiaz
danidiaz / flake.macos.nix
Last active May 10, 2023 10:59
My first Nix flake
{
# https://nix.dev/anti-patterns/language#unquoted-urls
inputs.nixpkgs.url = "github:NixOS/nixpkgs";
outputs = { self, nixpkgs, ... }@attrs:
# https://discourse.nixos.org/t/using-nixpkgs-legacypackages-system-vs-import/17462/5
# https://discourse.nixos.org/t/recommendations-for-use-of-flakes-input-follows/17413
let pkgs = nixpkgs.legacyPackages.aarch64-darwin;
in {
# https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-fmt.html
@danidiaz
danidiaz / shell.nix
Last active February 23, 2023 09:44
Wiremock shell.nix
# https://wiremock.org/docs/running-standalone/
# inspired by https://discourse.nixos.org/t/download-and-wrap-a-jar-extensively-documented-example/8049
{ pkgs ? import <nixpkgs> {} }:
let mywiremock =
pkgs.stdenv.mkDerivation rec {
name = "mywiremock";
version = "2.35.0";
# https://ryantm.github.io/nixpkgs/builders/fetchers/
src = pkgs.fetchurl {