Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

View snoyberg's full-sized avatar

Michael Snoyman snoyberg

View GitHub Profile
@snoyberg
snoyberg / rusty-monoid.rs
Created February 8, 2023 16:20
Rusty Monoid
#![feature(try_trait_v2)]
use std::ops::Try;
trait Monoid: Default {
fn mappend(self, rhs: Self) -> Self;
}
impl Monoid for i32 {
fn mappend(self, rhs: Self) -> Self {
self + rhs
@snoyberg
snoyberg / App.hs
Created December 21, 2022 14:13
Yes you really have to do this in two files these days :(
{-# LANGUAGE OverloadedStrings, QuasiQuotes, TemplateHaskell, TypeFamilies #-}
module App where
import ClassyPrelude hiding (Handler)
import Control.Exception.Safe (throw)
import Data.Aeson
import Deriving.Aeson
import GHC.Generics
import Prelude ()
@snoyberg
snoyberg / main.rs
Created November 24, 2021 16:03
Ouroboros append set
#![feature(hash_set_entry)]
use ouroboros::self_referencing;
use crate::append_set::AppendSet;
mod append_set {
use std::collections::HashSet;
use parking_lot::Mutex;
@snoyberg
snoyberg / conduit.rs
Created March 15, 2021 12:50
Basic and silly implementation of conduit in Rust
#![feature(never_type)]
pub enum Conduit<I, O, R> {
Send(O, Box<dyn FnOnce() -> Conduit<I, O, R>>),
Recv(Box<dyn FnOnce(Option<I>) -> Conduit<I, O, R>>),
Done(R),
Leftover(I, Box<dyn FnOnce() -> Conduit<I, O, R>>),
}
use Conduit::*;
@snoyberg
snoyberg / main.rs
Created December 29, 2020 16:33
HTTP reverse proxy in Rust, from December 29, 2020 livestream
use hyper::{Client, Server, Request, Response, Body};
use anyhow::*;
use std::net::SocketAddr;
use hyper::service::{make_service_fn, service_fn};
use std::sync::{Arc, RwLock};
fn mutate_request(req: &mut Request<Body>) -> Result<()> {
for key in &["content-length", "transfer-encoding", "accept-encoding", "content-encoding"] {
req.headers_mut().remove(*key);
}
@snoyberg
snoyberg / abonimable-snoyman.rs
Created December 2, 2020 15:05
Playing with GATs, transformers, and more
#![feature(generic_associated_types)]
#[allow(dead_code)]
trait Functor {
type Unwrapped;
type Wrapped<B>: Functor;
fn map<F, B>(self, f: F) -> Self::Wrapped<B>
where
F: FnMut(Self::Unwrapped) -> B;
@snoyberg
snoyberg / transformers.rs
Created December 2, 2020 08:39
Transformers: Rust in disguise
#![feature(generic_associated_types)]
trait Functor {
type Unwrapped;
type Wrapped<A>: Functor;
fn map<F, B>(self, f: F) -> Self::Wrapped<B>
where
F: FnOnce(Self::Unwrapped) -> B;
}
@snoyberg
snoyberg / check-status.hs
Created May 27, 2020 06:13
Check HTTP status codes
#!/usr/bin/env stack
-- stack --resolver lts-15.10 script
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
import RIO
import Network.HTTP.Simple
import qualified RIO.Text as T
main :: IO ()
main = runSimpleApp $ do
@snoyberg
snoyberg / Main.hs
Created April 1, 2020 08:54
Complete snapshot layer
#!/usr/bin/env stack
-- stack --resolver foo.yaml script
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
import Pantry
import RIO
import Path
import Path.IO
import Data.Yaml (encodeFile)
@snoyberg
snoyberg / Main.hs
Created April 8, 2019 05:54
Help debugging the pantry lock bug
import RIO
import Pantry
import Path
data App = App SimpleApp PantryConfig
instance HasPantryConfig App where
pantryConfigL = lens (\(App _ pc) -> pc) undefined
instance HasLogFunc App where
logFuncL = (lens (\(App sa _) -> sa) undefined).logFuncL