regular-0.2: src/Generics/Regular/Functions/GMap.hs
{-# LANGUAGE TypeOperators #-}
-----------------------------------------------------------------------------
-- |
-- Module : Generics.Regular.Functions.GMap
-- Copyright : (c) 2008 Universiteit Utrecht
-- License : BSD3
--
-- Maintainer : generics@haskell.org
-- Stability : experimental
-- Portability : non-portable
--
-- Summary: Monadic generic map.
-----------------------------------------------------------------------------
module Generics.Regular.Functions.GMap (
-- * Functorial map function
Functor (..),
-- * Monadic functorial map function
GMap (..)
) where
import Control.Monad
import Generics.Regular.Base
-----------------------------------------------------------------------------
-- Monadic functorial map function.
-----------------------------------------------------------------------------
-- | The @GMap@ class defines a monadic functorial map.
class GMap f where
fmapM :: Monad m => (a -> m b) -> f a -> m (f b)
instance GMap I where
fmapM f (I r) = liftM I (f r)
instance GMap (K a) where
fmapM _ (K x) = return (K x)
instance GMap U where
fmapM _ U = return U
instance (GMap f, GMap g) => GMap (f :+: g) where
fmapM f (L x) = liftM L (fmapM f x)
fmapM f (R x) = liftM R (fmapM f x)
instance (GMap f, GMap g) => GMap (f :*: g) where
fmapM f (x :*: y) = liftM2 (:*:) (fmapM f x) (fmapM f y)
instance GMap f => GMap (C c f) where
fmapM f (C x) = liftM C (fmapM f x)
instance GMap f => GMap (S s f) where
fmapM f (S x) = liftM S (fmapM f x)