{-# OPTIONS_GHC -O2 -fexcess-precision -Wall #-} {- ghc -o dist/build/generator-speed -package=synthesizer-core speedtest/Generator.hs These options achieve only little speedup of the slowest implementation sum0: -fvia-C -optc-ffast-math -optc-O3 -} module Main where import qualified Synthesizer.State.Signal as SigS import Control.Monad.Trans.State (runStateT, ) signal :: SigS.T Double signal = SigS.take (100*1000*1000) $ SigS.iterate (1+) 0 sum0 :: Double sum0 = let recurse acc = SigS.switchL acc (\x -> recurse (acc+x)) in recurse 0 signal sum1 :: Double sum1 = case signal of SigS.Cons nextAction s -> let next = runStateT nextAction recurse acc = maybe acc (\(x,sn) -> recurse (acc+x) sn) . next in recurse 0 s sum2 :: Double sum2 = SigS.runViewL signal (\next s -> let recurse acc = maybe acc (\(x,sn) -> recurse (acc+x) sn) . next in recurse 0 s) sum3 :: Double sum3 = SigS.runSwitchL signal (\next s -> let recurse acc = next acc (\x sn -> recurse (acc+x) sn) in recurse 0 s) sum4 :: Double sum4 = SigS.foldL (+) 0 signal main :: IO () main = print sum4