packages feed

rakuten-0.1.0.1: test/Rakuten/Test/Class.hs

{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE TypeSynonymInstances #-}

module Rakuten.Test.Class
    ( TestData(..)
    ) where

import           Data.Extensible
import           Data.Functor.Identity (Identity (..))
import           Data.Proxy
import           Data.Text             (Text)
import           GHC.TypeLits          (KnownSymbol)

class TestData a where
  testData :: a

instance TestData Int where
  testData = 12345

instance TestData Double where
  testData = 123.456

instance TestData Text where
  testData = "abcdefg"

instance TestData Bool where
  testData = False

instance (Applicative m, TestData a) => TestData (m a) where
  testData = pure testData

instance Forall (KeyValue KnownSymbol TestData) xs => TestData (Record xs) where
  testData = runIdentity $ hgenerateFor
    (Proxy :: Proxy (KeyValue KnownSymbol TestData)) (const $ pure (Field testData))