{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Test.Monad.Reader.Mutants where

import Control.Monad.Reader
import Data.Functor.Identity

import Test.Mutants

data LocalId

instance {-# OVERLAPPING #-}
  Monad m => MonadReader r (Mutant LocalId (ReaderT r) m) where
  ask = Mutant ask
  local _ = id

data LocalRunsTwice

instance {-# OVERLAPPING #-}
  Monad m => MonadReader r (Mutant LocalRunsTwice (ReaderT r) m) where
  ask = Mutant ask
  local f (Mutant m) = Mutant (local f (m >> m))

type MutantReaderT v r = Mutant v (ReaderT r)
type MutantReader v r = MutantReaderT v r Identity