Skip to content

Instantly share code, notes, and snippets.

@chrisdone
chrisdone / types.hs
Last active June 11, 2022 23:43
types
{-# LANGUAGE TypeOperators, LambdaCase, StandaloneDeriving, GADTs #-}
data Type env t where
-- A constant type. Add kinds?
-- Maybe, (), Int, Either, (->), etc.
Constructor :: kind -> Type env kind
-- A free variable.
-- a
FreeVariable :: kind -> Type env kind
-- Type application.
@chrisdone
chrisdone / ackermann.dhall
Last active April 7, 2020 09:02 — forked from Gabriella439/ackermann.dhall
Ackermann function in Dhall
-- Credit to: https://news.ycombinator.com/item?id=15186988
let iterate
: (Natural → Natural) → Natural → Natural
= \f n ->
fold (n + 1) f 1
let increment : Natural → Natural = \n -> n + 1
let ackermann
@chrisdone
chrisdone / normalized applicative.hs
Last active March 20, 2020 11:57
normalized applicative.hs
{-# LANGUAGE Strict #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE RankNTypes, InstanceSigs, KindSignatures, GADTs, ConstraintKinds, ScopedTypeVariables #-}
-- http://neilsculthorpe.com/publications/constrained-monad-problem.pdf
import Data.Function
import Data.List.NonEmpty (NonEmpty(..))
@chrisdone
chrisdone / Control.Applicative.Normalized.hs
Created March 20, 2020 10:20
Control.Applicative.Normalized.hs
{-# LANGUAGE RankNTypes, InstanceSigs, KindSignatures, GADTs, ConstraintKinds, ScopedTypeVariables #-}
-- http://neilsculthorpe.com/publications/constrained-monad-problem.pdf
import GHC.Exts
data NAF :: (* -> Constraint) -> (* -> *) -> * -> * where
Pure :: a -> NAF c t a
Ap :: c x => NAF c t (x -> a) -> t x -> NAF c t a
@chrisdone
chrisdone / Data.Functor.NormalizedConstrained.hs
Last active March 20, 2020 10:04
Data.Functor.NormalizedConstrained.hs
{-# LANGUAGE RankNTypes, InstanceSigs, KindSignatures, GADTs, ConstraintKinds #-}
-- Paper: http://neilsculthorpe.com/publications/constrained-monad-problem.pdf
-- Talk: https://vimeo.com/69261960
import GHC.Exts
data NF :: (* -> Constraint) -> (* -> *) -> * -> * where
FMap :: c x => (x -> a) -> t x -> NF c t a
{-# LANGUAGE OverloadedStrings #-}
-- |
module RIO.ConcurrentLog where
import qualified Data.ByteString.Builder as SB
import Data.List
import Data.Time
import RIO
@chrisdone
chrisdone / applicative-th.hs
Created February 24, 2020 16:04
Applicative TH
applicative :: Q Exp -> [Q Exp] -> Q Exp
applicative cons [] = [| pure $(cons) |]
applicative cons (x:ys) = foldl (\inner y -> [| $(inner) <*> $(y) |]) [|$(cons) <$> $(x)|] ys
@chrisdone
chrisdone / Data.Conduit.Error.hs
Created February 16, 2020 21:02
Data.Conduit.Error
-- | Conduit piping with error handling.
module Data.Conduit.Error where
import Data.Conduit.Internal
infixr 2 .|?
(.|?) :: Monad m => ConduitT a b m (Either e ()) -> ConduitT b c m (Either e r) -> ConduitT a c m (Either e r)
ConduitT left0 .|? ConduitT right0 =
ConduitT $ \rest ->
@chrisdone
chrisdone / FlushSource.hs
Last active February 6, 2020 11:21
Flushing source conduit
{-# LANGUAGE LambdaCase #-}
-- | Sources that flush when their monadic action takes longer than n
-- microseconds.
module Data.Conduit.Flush where
import Data.Conduit
import Data.Conduit.Internal as Pipe (ConduitT(..), Pipe(..))
import UnliftIO
{-# LANGUAGE ScopedTypeVariables #-}
-- | A ResourceT-based way to use connections with conduit.
module Data.Conduit.Network.Resource where
import qualified Network.Socket as NS
import Control.Exception
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource