Skip to content

Instantly share code, notes, and snippets.

View ChrisPenner's full-sized avatar
:bowtie:
Happily Hacking

Chris Penner ChrisPenner

:bowtie:
Happily Hacking
View GitHub Profile
@ChrisPenner
ChrisPenner / git-transplant
Last active February 12, 2021 15:26
Transplant commits from one source to another
#!/bin/bash
if [[ $# -ne 2 ]]; then
cat >&2 <<EOF
Transplant a branch from one root to another.
Handy if you've done a squash-merge and need to rebase <from> the old branch <onto> the new master.
Usage:
git transplant <from> <to>
where:
@ChrisPenner
ChrisPenner / cap.sh
Created April 5, 2020 18:16
Capture can replay command line output
#!/bin/bash
capdir=/tmp/cap
mkdir -p "$capdir"
record() {
tee "${capdir}/${1:-default}"
}
replay() {
@ChrisPenner
ChrisPenner / copy.sh
Created April 5, 2020 18:15
Copy/Pasta
#!/bin/bash
# Use at your own risk :P
FOLDER="/tmp/copy-pasta"
if [ $# -lt 1 ]; then
cat << EOF
usage: copy <files>
EOF
exit 1
fi
{-# LANGUAGE OverloadedStrings #-}
module TextSpan where
import Control.Lens
import qualified Data.Text as T
import Text.RawString.QQ (r)
import qualified Data.List as List
type Line = Int
type Col = Int
@ChrisPenner
ChrisPenner / Folds.Filtering.hs
Created January 19, 2020 16:48
Deck of cards example for Optics By Example
module Folds.Filtering where
import Control.Lens
data Card =
Card { _name :: String
, _aura :: Aura
, _holo :: Bool -- Is the card holographic
, _moves :: [Move]
} deriving (Show, Eq)
@ChrisPenner
ChrisPenner / Optics Cheatsheet.md
Last active April 12, 2024 14:24
Optics Cheatsheet
import Control.Lens
import Data.Typeable
import Data.Dynamic
dynamicLens :: Typeable a => (Lens' s a) -> Lens' s Dynamic
dynamicLens l = lens getter setter
where
getter s = toDyn $ view l s
setter s b =
case fromDynamic b of
@ChrisPenner
ChrisPenner / OpticsTraverse.hs
Created October 4, 2019 16:07
Optics traversals
You can use *most* optics as though they're a custom `traverse`
>>> (each . _Right) print (Left 1, Right 2, Left 3)
2
-- We can ignore the new structure it returns
(Left 1,Right (),Left 3)
It works on other types of effects too!
Here we use lists as a non-determinism effect to get all possible combos!
@ChrisPenner
ChrisPenner / Lib.hs
Created October 1, 2019 04:07
Cofree animation
module Lib where
import Control.Comonad.Cofree
import Control.Monad.Reader
import Control.Concurrent
drawBar :: Float -> IO ()
drawBar n = putStrLn (replicate (ceiling n) '#')
type Animation = Cofree (Reader Float) Float
@ChrisPenner
ChrisPenner / InfixHoles.hs
Created September 18, 2019 22:12
Infix Typed Holes
*Infix* typed holes!
>>> "suggest" `_` "concat" :: String
<interactive>:1:11: error:
• Found hole: _ :: [Char] -> [Char] -> String
Valid hole fits include
showString :: String -> ShowS
(++) :: forall a. [a] -> [a] -> [a]
showList :: forall a. Show a => [a] -> ShowS