packages feed

extensible-0.2.9: benchmarks/membership.hs

{-# LANGUAGE ViewPatterns, TypeOperators, GADTs, Rank2Types, ScopedTypeVariables #-}
import Data.Extensible
import Data.Extensible.Internal
import Control.Applicative
import Criterion.Main
import AtoZ
import Data.HList hiding (K(..))
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 "product" [
      bench "A" $ whnf (\(pluck -> A x) -> x) extensible26
    , bench "B"  $ whnf (\(pluck -> B x) -> x) extensible26
    , bench "C"  $ whnf (\(pluck -> C x) -> x) extensible26
    , bench "D"  $ whnf (\(pluck -> D x) -> x) extensible26
    , bench "E"  $ whnf (\(pluck -> E x) -> x) extensible26
    , bench "F"  $ whnf (\(pluck -> F x) -> x) extensible26
    , bench "G"  $ whnf (\(pluck -> G x) -> x) extensible26
    , bench "H"  $ whnf (\(pluck -> H x) -> x) extensible26
    , bench "I"  $ whnf (\(pluck -> I x) -> x) extensible26
    , bench "J"  $ whnf (\(pluck -> J x) -> x) extensible26
    , bench "K"  $ whnf (\(pluck -> K x) -> x) extensible26
    , bench "L"  $ whnf (\(pluck -> L x) -> x) extensible26
    , bench "M"  $ whnf (\(pluck -> M x) -> x) extensible26
    , bench "N"  $ whnf (\(pluck -> N x) -> x) extensible26
    , bench "O"  $ whnf (\(pluck -> O x) -> x) extensible26
    , bench "P"  $ whnf (\(pluck -> P x) -> x) extensible26
    , bench "Q"  $ whnf (\(pluck -> Q x) -> x) extensible26
    , bench "R"  $ whnf (\(pluck -> R x) -> x) extensible26
    , bench "S"  $ whnf (\(pluck -> S x) -> x) extensible26
    , bench "T"  $ whnf (\(pluck -> T x) -> x) extensible26
    , bench "U"  $ whnf (\(pluck -> U x) -> x) extensible26
    , bench "V"  $ whnf (\(pluck -> V x) -> x) extensible26
    , bench "W"  $ whnf (\(pluck -> W x) -> x) extensible26
    , bench "X"  $ whnf (\(pluck -> X x) -> x) extensible26
    , bench "Y"  $ whnf (\(pluck -> Y x) -> x) extensible26
    , bench "Z"  $ whnf (\(pluck -> Z x) -> x) extensible26
    , bench "A"  $ whnf (\(hOccursFst -> A x) -> x) hlist26
    , bench "B"  $ whnf (\(hOccursFst -> B x) -> x) hlist26
    , bench "C"  $ whnf (\(hOccursFst -> C x) -> x) hlist26
    , bench "D"  $ whnf (\(hOccursFst -> D x) -> x) hlist26
    , bench "E"  $ whnf (\(hOccursFst -> E x) -> x) hlist26
    , bench "F"  $ whnf (\(hOccursFst -> F x) -> x) hlist26
    , bench "G"  $ whnf (\(hOccursFst -> G x) -> x) hlist26
    , bench "H"  $ whnf (\(hOccursFst -> H x) -> x) hlist26
    , bench "I"  $ whnf (\(hOccursFst -> I x) -> x) hlist26
    , bench "J"  $ whnf (\(hOccursFst -> J x) -> x) hlist26
    , bench "K"  $ whnf (\(hOccursFst -> K x) -> x) hlist26
    , bench "L"  $ whnf (\(hOccursFst -> L x) -> x) hlist26
    , bench "M"  $ whnf (\(hOccursFst -> M x) -> x) hlist26
    , bench "N"  $ whnf (\(hOccursFst -> N x) -> x) hlist26
    , bench "O"  $ whnf (\(hOccursFst -> O x) -> x) hlist26
    , bench "P"  $ whnf (\(hOccursFst -> P x) -> x) hlist26
    , bench "Q"  $ whnf (\(hOccursFst -> Q x) -> x) hlist26
    , bench "R"  $ whnf (\(hOccursFst -> R x) -> x) hlist26
    , bench "S"  $ whnf (\(hOccursFst -> S x) -> x) hlist26
    , bench "T"  $ whnf (\(hOccursFst -> T x) -> x) hlist26
    , bench "U"  $ whnf (\(hOccursFst -> U x) -> x) hlist26
    , bench "V"  $ whnf (\(hOccursFst -> V x) -> x) hlist26
    , bench "W"  $ whnf (\(hOccursFst -> W x) -> x) hlist26
    , bench "X"  $ whnf (\(hOccursFst -> X x) -> x) hlist26
    , bench "Y"  $ whnf (\(hOccursFst -> Y x) -> x) hlist26
    , bench "Z"  $ whnf (\(hOccursFst -> Z x) -> x) hlist26

    ]
  , 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 "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
    ]
  ]