packages feed

vinyl-0.5.2: benchmarks/EqualityBench.hs

{-# LANGUAGE DataKinds, TypeFamilies, UndecidableInstances #-}
import Control.Monad (join)
import Criterion.Main
import Data.Functor.Identity
import Data.Vinyl
import Data.Vinyl.TypeLevel

class Eq2 a where
  eq2 :: a -> a -> Bool

instance RecAll f rs Eq => Eq2 (Rec f rs) where
  eq2 RNil RNil = True
  eq2 (a :& as) (b :& bs) = a == b && eq2 as bs

main :: IO ()
main = defaultMain [
         bench "Eq" $ whnf (join (==)) r1
       , bench "Eq2" $ whnf (join eq2) r1 ]
  where r1 = pure 23 :& pure 'b' :& pure 3.14 :& RNil :: Rec Identity '[Int, Char, Double]