packages feed

aztecs-0.1.0.0: bench/Iter.hs

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeApplications #-}

import Criterion.Main
import Data.Aztecs
import qualified Data.Aztecs.Query as Q
import Data.Aztecs.System (runSystem)
import qualified Data.Aztecs.System as S
import qualified Data.Aztecs.World as W
import Data.Foldable (foldrM)

newtype Position = Position Int deriving (Show)

instance Component Position

newtype Velocity = Velocity Int deriving (Show)

instance Component Velocity

data S

instance System IO S where
  access = do
    _ <- S.all $ do
      Velocity y <- Q.read
      Q.write (\(Position x) -> Position (x + y))
    return ()

runner :: World -> IO ()
runner w = do
  !_ <- runSystem @S w
  return ()

main :: IO ()
main = do
  !w <-
    foldrM
      ( \_ wAcc -> do
          (_, wAcc') <- W.spawn (Position 0) wAcc
          return wAcc'
      )
      W.newWorld
      [0 :: Int .. 10000]
  defaultMain [bench "iter" $ nfIO (runner w)]