module Quasar.Utils.ExtraT (
  ExtraT(..),
  Extra(..),
) where

-- Use prelude from `base` to prevent module import cycle. This allows using ExtraT in PreludeExtras.
import Prelude

import Data.Bifunctor

newtype ExtraT s m r = ExtraT {
  runExtraT :: m (s, r)
}
instance Functor m => Functor (ExtraT s m) where
  fmap :: (a -> b) -> ExtraT s m a -> ExtraT s m b
  fmap fn = ExtraT . fmap (second fn) . runExtraT

newtype Extra s r = Extra {
  runExtra :: (s, r)
}
instance Functor (Extra s) where
  fmap :: (a -> b) -> Extra s a -> Extra s b
  fmap fn = Extra . second fn . runExtra