traverse-with-class 1.0.0.0 → 1.0.1.0
raw patch · 3 files changed
+116/−1 lines, 3 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Data.Generics.Traversable.Generic: class GTraversable' c (f :: * -> *)
+ Data.Generics.Traversable.Generic: gtraverse' :: (GTraversable' c f, Applicative g) => (forall d. c d => d -> g d) -> forall p. f p -> g (f p)
+ Data.Generics.Traversable.Generic: instance (Data.Generics.Traversable.Generic.GTraversable' c f, Data.Generics.Traversable.Generic.GTraversable' c g) => Data.Generics.Traversable.Generic.GTraversable' c (f GHC.Generics.:*: g)
+ Data.Generics.Traversable.Generic: instance (Data.Generics.Traversable.Generic.GTraversable' c f, Data.Generics.Traversable.Generic.GTraversable' c g) => Data.Generics.Traversable.Generic.GTraversable' c (f GHC.Generics.:+: g)
+ Data.Generics.Traversable.Generic: instance (Data.Traversable.Traversable f, Data.Generics.Traversable.Generic.GTraversable' c g) => Data.Generics.Traversable.Generic.GTraversable' c (f GHC.Generics.:.: g)
+ Data.Generics.Traversable.Generic: instance (GHC.Generics.Generic a, Data.Generics.Traversable.Generic.GTraversable' c (GHC.Generics.Rep a)) => Data.Generics.Traversable.Core.GTraversable c a
+ Data.Generics.Traversable.Generic: instance (forall p. Data.Generics.Traversable.Core.GTraversable c (f p)) => Data.Generics.Traversable.Generic.GTraversable' c (GHC.Generics.Rec1 f)
+ Data.Generics.Traversable.Generic: instance Data.Generics.Traversable.Generic.GTraversable' c GHC.Generics.Par1
+ Data.Generics.Traversable.Generic: instance Data.Generics.Traversable.Generic.GTraversable' c GHC.Generics.U1
+ Data.Generics.Traversable.Generic: instance Data.Generics.Traversable.Generic.GTraversable' c GHC.Generics.V1
+ Data.Generics.Traversable.Generic: instance Data.Generics.Traversable.Generic.GTraversable' c f => Data.Generics.Traversable.Generic.GTraversable' c (GHC.Generics.M1 i meta f)
+ Data.Generics.Traversable.Generic: instance c con => Data.Generics.Traversable.Generic.GTraversable' c (GHC.Generics.K1 i con)
- Data.Generics.Traversable: class GTraversable (c :: * -> Constraint) a where gtraverse _ x = pure x
+ Data.Generics.Traversable: class GTraversable (c :: * -> Constraint) a
- Data.Generics.Traversable: everything :: forall c r a. (Rec c a) => (r -> r -> r) -> (forall d. (Rec c d) => d -> r) -> a -> r
+ Data.Generics.Traversable: everything :: forall c r a. Rec c a => (r -> r -> r) -> (forall d. Rec c d => d -> r) -> a -> r
- Data.Generics.Traversable: everywhere :: forall c a. (Rec c a) => (forall d. (Rec c d) => d -> d) -> a -> a
+ Data.Generics.Traversable: everywhere :: forall c a. Rec c a => (forall d. Rec c d => d -> d) -> a -> a
- Data.Generics.Traversable: everywhere' :: forall c a. (Rec c a) => (forall d. (Rec c d) => d -> d) -> a -> a
+ Data.Generics.Traversable: everywhere' :: forall c a. Rec c a => (forall d. Rec c d => d -> d) -> a -> a
- Data.Generics.Traversable: everywhereM :: forall c m a. (Monad m, Rec c a) => (forall d. (Rec c d) => d -> m d) -> a -> m a
+ Data.Generics.Traversable: everywhereM :: forall c m a. (Monad m, Rec c a) => (forall d. Rec c d => d -> m d) -> a -> m a
- Data.Generics.Traversable: gfoldMap :: forall c r a. (Monoid r, GTraversable c a) => (forall d. (c d) => d -> r) -> a -> r
+ Data.Generics.Traversable: gfoldMap :: forall c r a. (Monoid r, GTraversable c a) => (forall d. c d => d -> r) -> a -> r
- Data.Generics.Traversable: gfoldl' :: forall c a r. (GTraversable c a) => (forall d. (c d) => r -> d -> r) -> r -> a -> r
+ Data.Generics.Traversable: gfoldl' :: forall c a r. GTraversable c a => (forall d. c d => r -> d -> r) -> r -> a -> r
- Data.Generics.Traversable: gfoldr :: forall c a r. (GTraversable c a) => (forall d. (c d) => d -> r -> r) -> r -> a -> r
+ Data.Generics.Traversable: gfoldr :: forall c a r. GTraversable c a => (forall d. c d => d -> r -> r) -> r -> a -> r
- Data.Generics.Traversable: gmap :: forall c a. (GTraversable c a) => (forall d. (c d) => d -> d) -> a -> a
+ Data.Generics.Traversable: gmap :: forall c a. GTraversable c a => (forall d. c d => d -> d) -> a -> a
- Data.Generics.Traversable: gmapM :: forall c m a. (Monad m, GTraversable c a) => (forall d. (c d) => d -> m d) -> a -> m a
+ Data.Generics.Traversable: gmapM :: forall c m a. (Monad m, GTraversable c a) => (forall d. c d => d -> m d) -> a -> m a
- Data.Generics.Traversable.Zipper: getHole :: (Typeable b) => Zipper Typeable a -> Maybe b
+ Data.Generics.Traversable.Zipper: getHole :: Typeable b => Zipper Typeable a -> Maybe b
- Data.Generics.Traversable.Zipper: setHole :: (Typeable a) => a -> Zipper Typeable b -> Zipper Typeable b
+ Data.Generics.Traversable.Zipper: setHole :: Typeable a => a -> Zipper Typeable b -> Zipper Typeable b
- Data.Generics.Traversable.Zipper: setHole' :: (Typeable a) => a -> Zipper Typeable b -> Maybe (Zipper Typeable b)
+ Data.Generics.Traversable.Zipper: setHole' :: Typeable a => a -> Zipper Typeable b -> Maybe (Zipper Typeable b)
Files
- CHANGES.md +5/−0
- Data/Generics/Traversable/Generic.hs +109/−0
- traverse-with-class.cabal +2/−1
CHANGES.md view
@@ -1,6 +1,11 @@ Changes ======= +Version 1.0.1.0+---------------++Add `Data.Generics.Traversable.Generic`+ Version 1.0.0.0 ---------------
+ Data/Generics/Traversable/Generic.hs view
@@ -0,0 +1,109 @@+-- | 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.+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE ScopedTypeVariables #-}++# if MIN_VERSION_GLASGOW_HASKELL(8, 6, 1, 0)+{-# LANGUAGE QuantifiedConstraints #-}+# else+{-# LANGUAGE DataKinds #-}+# endif++{-# OPTIONS_GHC -Wno-orphans #-}+module Data.Generics.Traversable.Generic where++import Data.Generics.Traversable+import GHC.Generics++# if MIN_VERSION_GLASGOW_HASKELL(8, 6, 1, 0)+# else+import GHC.TypeLits (TypeError, ErrorMessage (..))+# endif++-- | Special version of 'GTraversable' for the representation types+-- from 'Generic'.+class GTraversable' c (f :: * -> *) where+ gtraverse' :: Applicative g => (forall d. c d => d -> g d) -> (forall p. f p -> g (f p))++instance GTraversable' c U1 where+ gtraverse' _f U1 = pure U1++instance GTraversable' c V1 where+ gtraverse' _f = error "Impossible"++instance GTraversable' c Par1 where+ gtraverse' _f par1 = pure par1++# if MIN_VERSION_GLASGOW_HASKELL(8, 6, 1, 0)+instance (forall p. GTraversable c (f p)) => GTraversable' c (Rec1 f) where+ gtraverse' f (Rec1 recur) = Rec1 <$> gtraverse @c f recur+# else+instance+ ( TypeError+ ( 'Text "No generic instance can be derived for " ':$$: 'ShowType f ':$$:+ 'Text " for this GHC version - upgrade to at least 8.6.1 to be" ':$$:+ 'Text " able to use `GTraversable` from `Generic` here"+ )+ )+ => GTraversable' c (Rec1 f) where+ gtraverse' _ _ = error "Cannot implement `gtraverse'` for this type"+# endif++instance (c con) => GTraversable' c (K1 i con) where+ gtraverse' f (K1 con) = K1 <$> f con++instance (GTraversable' c f) => GTraversable' c (M1 i meta f) where+ gtraverse' f (M1 inner) = M1 <$> gtraverse' @c f inner++instance (GTraversable' c f, GTraversable' c g) => GTraversable' c (f :+: g) where+ gtraverse' f (L1 val) = L1 <$> gtraverse' @c f val+ gtraverse' f (R1 val) = R1 <$> gtraverse' @c f val++instance (GTraversable' c f, GTraversable' c g) => GTraversable' c (f :*: g) where+ gtraverse' f (left :*: right)+ = (:*:) <$> gtraverse' @c f left <*> gtraverse' @c f right++instance (Traversable f, GTraversable' c g) => GTraversable' c (f :.: g) where+ gtraverse' f (Comp1 comp) = Comp1 <$> traverse (gtraverse' @c f) comp++instance+ {-# OVERLAPPABLE #-}+ (Generic a, GTraversable' c (Rep a))+ => GTraversable c a+ where+ gtraverse f val+ = to <$> gtraverse' @c f (from val)
traverse-with-class.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: traverse-with-class-version: 1.0.0.0+version: 1.0.1.0 synopsis: Generic applicative traversals description: This is a generic programming library in the spirit of \"Scrap your boilerplate with class\", but with several@@ -28,6 +28,7 @@ library exposed-modules: Data.Generics.Traversable+ Data.Generics.Traversable.Generic Data.Generics.Traversable.TH Data.Generics.Traversable.Zipper other-modules: