Skip to content

Instantly share code, notes, and snippets.

View snoyberg's full-sized avatar

Michael Snoyman snoyberg

View GitHub Profile
#!/usr/bin/env stack
-- stack --resolver lts-12.21 script
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
import Control.Monad (replicateM)
import System.Random
import RIO
@snoyberg
snoyberg / doesnt-stall.hs
Created June 21, 2018 13:58
Ensure that a conduit produces output every X microseconds
#!/usr/bin/env stack
-- stack --resolver lts-11.10 script
{-# LANGUAGE NoImplicitPrelude #-}
import RIO
import Conduit
import Control.Concurrent.STM.TBMQueue
doesn'tStall
:: MonadUnliftIO m
=> Int -- ^ number of microseconds
@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 / 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 ()
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Yesod
import Yesod.OptionalSubsite
import Yesod.Static
data HelloWorld = HelloWorld
getStatic _ = OptionalSubsite Nothing
@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;
{-# LANGUAGE OverloadedStrings #-}
module FileViewer where
import Control.Concurrent (forkIO)
import Control.Monad (void)
import Network.Wai.Application.Static (defaultFileServerSettings,
staticApp)
import Network.Wai.Handler.Warp (run)
import Prelude (IO, read, ($))
#!/usr/bin/env stack
-- stack --resolver lts-12.18 script
import Control.Concurrent (threadDelay)
import Control.Concurrent.Async (replicateConcurrently_)
import Control.Monad (unless)
import Data.IORef
import System.Random (randomIO)
main :: IO ()
main = do