{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE UndecidableInstances #-}
module Generic where
import Test.HUnit
import qualified Data.Vector.Unboxing as V
import GHC.Generics
import Foo (Foo,mkFoo)
-- Deriving using Generic
data ComplexDouble = ComplexDouble { realPartD :: {-# UNPACK #-} !Double
, imagPartD :: {-# UNPACK #-} !Double
}
deriving (Eq,Show,Generic)
deriving V.Unboxable via V.Generics ComplexDouble
testComplexDouble = TestCase $ do
let v :: V.Vector ComplexDouble
v = V.singleton (ComplexDouble 1.0 2.0)
x :: V.Vector Double
x = V.map realPartD v
assertEqual "construction" (ComplexDouble 1.0 2.0) (V.head v)
assertEqual "map" (V.singleton 1.0) x
data Bar = Bar {-# UNPACK #-} !Foo {-# UNPACK #-} !Double
deriving (Eq,Show,Generic)
deriving V.Unboxable via V.Generics Bar
testBar = TestCase $ do
let v :: V.Vector Bar
v = V.singleton (Bar mkFoo 3.14)
assertEqual "construction" (Bar mkFoo 3.14) (V.head v)
assertEqual "map" (V.singleton mkFoo) (V.map (\(Bar foo _) -> foo) v)