data-diverse-4.7.1.0: src/Data/Diverse/ATraversable.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Diverse.ATraversable where
import Data.Diverse.TypeLevel
-- | Given a 'Data.Diverse.Case' that transforms each type in the typelist within an
-- 'Applicative' context @m@, convert a @f xs@ to @m (f ('TraverseResults' c m xs))@,
-- where @('TraverseResults' c m xs)@ corresponds to @('CaseResults' (c m) xs)@ with the
-- @m@ layer peeled off from each result.
--
-- This is primarily meant to be used with 'Data.Diverse.Case.Case's from the
-- "Data.Diverse.CaseIxed" module.
class ATraversable f c m xs where
atraverse
:: ( Applicative m
-- Throws a type error when the 'Case' is stuck
-- (most likely because the kind does not match).
, IsTraversalCase c
-- Defers the evaluation of the traversal results, to avoid getting another
-- (confusing) type error when the 'Case' is stuck.
, xs' ~ (TraverseResults c m xs)
)
=> c m xs
-> f xs
-> m (f xs')