{-# LANGUAGE FlexibleContexts, FlexibleInstances, GADTs                  #-}
{-# LANGUAGE MultiParamTypeClasses, NoMonomorphismRestriction, PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables, TypeFamilies, UndecidableInstances     #-}
module Algebra.Field.Prime.Test where
import Algebra.Field.Finite.Test

import Algebra.Field.Prime    (F)
import Data.Reflection        (Reifies)
import Prelude                (Integer, Maybe (..), Monad)
import Test.QuickCheck        (Arbitrary (..))
import Test.SmallCheck.Series (Serial (..))

instance Reifies p Integer => Arbitrary (F p) where
  arbitrary :: Gen (F p)
arbitrary = Maybe (F p) -> Gen (F p)
forall k (proxy :: * -> *). FiniteField k => proxy k -> Gen k
arbitraryFiniteField (Maybe (F p)
forall a. Maybe a
Nothing :: Maybe (F p))

instance (Monad m, Reifies p Integer) => Serial m (F p) where
  series :: Series m (F p)
series = Maybe (F p) -> Series m (F p)
forall k (m :: * -> *) (proxy :: * -> *).
(FiniteField k, Monad m) =>
proxy k -> Series m k
seriesFiniteField (Maybe (F p)
forall a. Maybe a
Nothing :: Maybe (F p))