traverse-with-class-1.0.1.1: Generic applicative traversals
Safe HaskellNone
LanguageHaskell2010

Data.Generics.Traversable.Generic

Description

For a datatype where every subterm is interesting, it is possible to leverage Generic to automatically produce the GTraversable instance.

This module defines a default GTraversable instance for most Generic types, though you can override it with a custom instance if you so wish. The gtraverse implementation for this instance traverses every subterm, and traverses left-to-right on products :*:.

Example usage:

{-# LANGUAGE FlexibleInstances, DeriveGeneric #-}
import Data.Maybe (isJust)

data MyConfig = MyConfig
  { firstKey  :: Maybe Int
  , secondKey :: Maybe String
  , thirdKey  :: Maybe Bool
  }
  deriving (Generic)

class SettableConfigKey a where
  isSet :: a -> Bool

instance SettableConfigKey (Maybe a) where
  isSet = isJust

isAnyConfigKeySet :: MyConfig -> Bool
isAnyConfigKeySet = gfoldr @SettableConfigKey ((||) . isSet)

For Generic types that have Rec1 in their representation, this module will not work for GHC versions below 8.6.1, as the instance makes use of QuantifiedConstraints. Instead, the instance for Rec1 will cause a type error.

Synopsis

Documentation

class GTraversable' c (f :: * -> *) where Source #

Special version of GTraversable for the representation types from Generic.

Methods

gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> forall p. f p -> g (f p) Source #

Instances

Instances details
GTraversable' c Par1 Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> forall p. Par1 p -> g (Par1 p) Source #

GTraversable' c (V1 :: Type -> Type) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> forall p. V1 p -> g (V1 p) Source #

GTraversable' c (U1 :: Type -> Type) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> forall p. U1 p -> g (U1 p) Source #

(forall p. GTraversable c (f p)) => GTraversable' c (Rec1 f) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> forall p. Rec1 f p -> g (Rec1 f p) Source #

(GTraversable' c f, GTraversable' c g) => GTraversable' c (f :*: g) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g0 => (forall d. c d => d -> g0 d) -> forall p. (f :*: g) p -> g0 ((f :*: g) p) Source #

(GTraversable' c f, GTraversable' c g) => GTraversable' c (f :+: g) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g0 => (forall d. c d => d -> g0 d) -> forall p. (f :+: g) p -> g0 ((f :+: g) p) Source #

c con => GTraversable' c (K1 i con :: Type -> Type) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> forall p. K1 i con p -> g (K1 i con p) Source #

(Traversable f, GTraversable' c g) => GTraversable' c (f :.: g) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g0 => (forall d. c d => d -> g0 d) -> forall p. (f :.: g) p -> g0 ((f :.: g) p) Source #

GTraversable' c f => GTraversable' c (M1 i meta f) Source # 
Instance details

Defined in Data.Generics.Traversable.Generic

Methods

gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> forall p. M1 i meta f p -> g (M1 i meta f p) Source #

Orphan instances

(Generic a, GTraversable' c (Rep a)) => GTraversable c a Source # 
Instance details

Methods

gtraverse :: Applicative f => (forall d. c d => d -> f d) -> a -> f a Source #