packages feed

queues-1.0.0: bench/ephemeral-queue/Main.hs

{-# OPTIONS_GHC -Wno-incomplete-patterns #-}

module Main (main) where

import Queue.Ephemeral (EphemeralQueue)
import Queue.Ephemeral qualified
import Test.Tasty.Bench (bench, defaultMain, whnf)

main :: IO ()
main = do
  let n = 100000 :: Int
  defaultMain [bench "EphemeralQueue" (whnf theBenchmark n)]

theBenchmark :: Int -> Int
theBenchmark num =
  loop1 0 0 (Queue.Ephemeral.enqueue 0 Queue.Ephemeral.empty)
  where
    loop1 :: Int -> Int -> EphemeralQueue Int -> Int
    loop1 !n !acc queue
      | n == num = loop2 acc queue
      | otherwise =
          case Queue.Ephemeral.dequeue queue of
            Just (m, queue') -> loop1 (n + 1) (acc + m) (Queue.Ephemeral.enqueue n (Queue.Ephemeral.enqueue (n + 1) queue'))

    loop2 :: Int -> EphemeralQueue Int -> Int
    loop2 !n queue =
      case Queue.Ephemeral.dequeue queue of
        Nothing -> n
        Just (m, queue') -> loop2 (n + m) queue'