Skip to content

Instantly share code, notes, and snippets.

View michaelt's full-sized avatar

michaelt michaelt

  • twitter antiphasis_
View GitHub Profile
@michaelt
michaelt / streams.hs
Created October 8, 2016 00:36
little streaming library
{-#LANGUAGE BangPatterns #-}
import GHC.Magic
import Data.IORef
import Control.Monad
import Control.Monad.Trans
data Stream a m r = Yield a (Stream a m r) | Done r | Delay (() -> m (Stream a m r))
instance Functor m => Functor (Stream a m) where
fmap f (Done r) = Done (f r)
@michaelt
michaelt / gist:c77399da99c0a4e2ffdc728deb9bdbfc
Created October 8, 2016 00:04
little streaming library
{-#LANGUAGE BangPatterns #-}
import GHC.Magic
import Data.IORef
import Control.Monad
import Control.Monad.Trans
data Stream a m r = Yield a (Stream a m r) | Done r | Delay (() -> m (Stream a m r))
instance Functor m => Functor (Stream a m) where
fmap f (Done r) = Done (f r)
@michaelt
michaelt / oneShot.hs
Created October 7, 2016 02:47
sink to run with the await oneshot rule
{-#LANGUAGE BangPatterns #-}
import Pipes
import qualified Pipes.Prelude as P
import Control.Monad.Trans.State.Strict
import GHC.Magic
import qualified Pipes.Internal as I
import Data.IORef
import Control.Monad
emit :: Int -> Int -> IORef Int -> Producer Int IO ()
@michaelt
michaelt / pipes_oneshot.hs
Created October 7, 2016 02:43
oneShot rule for 'await >>= f'
{-#LANGUAGE BangPatterns #-}
import Pipes
import qualified Pipes.Prelude as P
import Control.Monad.Trans.State.Strict
import GHC.Magic
import qualified Pipes.Internal as I
import Data.IORef
import Control.Monad
await' :: Monad m => Proxy () a y' y m a
@michaelt
michaelt / Sink.hs
Created October 5, 2016 12:46
oneShot + Sink
module Main (main) where
import System.IO.Error
import GHC.Magic
data Sink = Await (Maybe Char -> Sink) | Done Int
countFrom :: Int -> Sink
countFrom n = let k = countFrom $! n + 1
-- in Await $ \mi -> case mi of
module Main where
import qualified Foundation as F
import qualified Foundation.Collection as F
import qualified Foundation.String as F
import qualified Foundation.Compat.ByteString as F
import Criterion.Main
import qualified Data.Text as T
@michaelt
michaelt / Text.hs
Created August 13, 2016 23:09
bench Foundation compared to Text
module Main where
import qualified Foundation as F
import qualified Foundation.Collection as F
import qualified Foundation.String as F
import Criterion.Main
import qualified Data.Text as T
@michaelt
michaelt / benchcompose.hs
Last active June 13, 2016 20:18
benchmark prelude compositions following the pattern of john weigley's https://github.com/jwiegley/streaming-tests
{-#LANGUAGE BangPatterns #-}
module Main (main) where
import Data.Conduit as C
import qualified Data.Conduit.Combinators as C
import Pipes as P
import qualified Pipes.Prelude as P
import qualified Streaming.Prelude as Str
{-#LANGUAGE BangPatterns #-}
-- module Main (main) where
import Data.Conduit as C
import qualified Data.Conduit.Combinators as C
import Pipes as P
import qualified Pipes.Prelude as P
import qualified Streaming.Prelude as Str
benchmarking fold/streaming
time 1.493 ms (1.400 ms .. 1.591 ms)
0.978 R² (0.973 R² .. 0.987 R²)
mean 1.365 ms (1.331 ms .. 1.414 ms)
std dev 131.6 μs (100.7 μs .. 169.4 μs)
variance introduced by outliers: 69% (severely inflated)
benchmarking fold/conduit
time 3.539 ms (3.431 ms .. 3.663 ms)
0.991 R² (0.985 R² .. 0.995 R²)