packages feed

extensible-0.2.8: benchmarks/membership.hs

{-# LANGUAGE ViewPatterns, TypeOperators, GADTs #-}
import Data.Extensible
import Data.Extensible.Internal
import Criterion.Main
import AtoZ
import Unsafe.Coerce

data Sum = C0 A|C1 B|C2 C|C3 D|C4 E|C5 F|C6 G|C7 H|C8 I|C9 J|C10 K |C11 L|C12 M
  |C13 N|C14 O|C15 P|C16 Q|C17 R|C18 S|C19 T|C20 U|C21 V|C22 W|C23 X|C24 Y|C25 Z

testNaive :: Sum -> Int
testNaive (C0 (A n)) = n
testNaive (C1 (B n)) = n
testNaive (C2 (C n)) = n
testNaive (C3 (D n)) = n
testNaive (C4 (E n)) = n
testNaive (C5 (F n)) = n
testNaive (C6 (G n)) = n
testNaive (C7 (H n)) = n
testNaive (C8 (I n)) = n
testNaive (C9 (J n)) = n
testNaive (C10 (K n)) = n
testNaive (C11 (L n)) = n
testNaive (C12 (M n)) = n
testNaive (C13 (N n)) = n
testNaive (C14 (O n)) = n
testNaive (C15 (P n)) = n
testNaive (C16 (Q n)) = n
testNaive (C17 (R n)) = n
testNaive (C18 (S n)) = n
testNaive (C19 (T n)) = n
testNaive (C20 (U n)) = n
testNaive (C21 (V n)) = n
testNaive (C22 (W n)) = n
testNaive (C23 (X n)) = n
testNaive (C24 (Y n)) = n
testNaive (C25 (Z n)) = n

testExt :: K0 :| AtoZ -> Int
testExt = match match26

main = defaultMain [
  bgroup "sum" [
     bench "A" $ whnf testExt (bury (A 0))
    , bench "M" $ whnf testExt (bury (M 0))
    , bench "T" $ whnf testExt (bury (T 0))
    , bench "Z" $ whnf testExt (bury (Z 0))
    , bench "A_" $ whnf testNaive  (C0 (A 0))
    , bench "M_" $ whnf testNaive (C12 (M 0))
    , bench "T_" $ whnf testNaive (C19 (T 0))
    , bench "Z_" $ whnf testNaive (C25 (Z 0))
    ]
  , bgroup "product" [
      bench "A" $ whnf (\(pluck -> A x) -> x) blah26
    , bench "G"  $ whnf (\(pluck -> G x) -> x) blah26
    , bench "N"  $ whnf (\(pluck -> N x) -> x) blah26
    , bench "T"  $ whnf (\(pluck -> T x) -> x) blah26
    , bench "Z" $ whnf (\(pluck -> Z x) -> x) blah26
    ]
  , bgroup "tuple" [
      bench "A" $ whnf (\(a,b,c,d,e,f,g,h,i,j,k,l,M res,n,o,p,q,r,s,t,u,v,w,x,y,z) -> res) tuple26
    ]
  ]