{-# LANGUAGE CPP #-}

module Functor
  ( -- * Functor
    Functor(..)
  , (<$>)
  , ($>)
#if MIN_VERSION_base(4,11,0)
  , (<&>)
#endif
  , void
  , unzip
    -- ** Optics
  , mapped
    -- * Apply
  , Apply(..)
  , liftF3
    -- ** Newtypes
  , MaybeApply(..)
  , Static(..)
    -- * Alt
  , Alt(..)
    -- * Plus
  , Plus(..)
    -- * Bind
  , Bind(..)
  , (-<<)
    -- * Extend
  , Extend(..)
    -- * MFunctor
  , MFunctor(..)
  ) where

import Control.Lens.Setter (mapped)
import Control.Monad.Morph (MFunctor, hoist)
import Data.Functor        (Functor(fmap, (<$)), void, ($>), (<$>))
#if MIN_VERSION_base(4,11,0)
import Data.Functor ((<&>))
#endif
import Data.Functor.Alt         (Alt((<!>)))
import Data.Functor.Apply       (Apply(liftF2, (.>), (<.), (<.>)),
                                 MaybeApply(MaybeApply, runMaybeApply), liftF3)
import Data.Functor.Bind        (Bind(join, (>>-)), (-<<))
import Data.Functor.Extend      (Extend(duplicated, extended))
import Data.Functor.Plus        (Plus(zero))
import Data.List.NonEmpty       (unzip)
import Data.Semigroupoid.Static (Static(Static, runStatic))