-- | This module provides linear traversals. -- -- Traversals provides a means of accessing several @a@s organized in some -- structural way in an @s@, and a means of changing them to @b@s to create a -- @t@. In very ordinary language, it's like walking or traversing the data -- structure, going across cases and inside definitions. In more imaginative -- language, it's like selecting some specific @a@s by looking at each -- constructor of a data definition and recursing on each non-basic type -- (where basic types are things like @Int@, @Bool@ or @Char@). -- -- = Example -- -- @ -- {-# LANGUAGE LinearTypes #-} -- {-# LANGUAGE NoImplicitPrelude #-} -- {-# LANGUAGE RankNTypes #-} -- {-# LANGUAGE GADTs #-} -- -- import Control.Optics.Linear.Internal -- import qualified Control.Functor.Linear as Control -- import Control.Functor.Linear ((<$>), (<*>), pure) -- import Prelude.Linear -- -- -- We can use a traversal to append a string only to the -- -- human names in a classroom struct -- appendToNames :: String -> Classroom %1-> Classroom -- appendToNames s = over classroomNamesTrav (\name -> name ++ s) -- -- data Classroom where -- Classroom :: -- { className :: String -- , teacherName :: String -- , classNum :: Int -- , students :: [Student] -- , textbooks :: [String] -- } %1-> Classroom -- -- -- A Student is a name and a student id number -- data Student = Student String Int -- -- classroomNamesTrav :: Traversal' Classroom String -- classroomNamesTrav = traversal traverseClassStr where -- traverseClassStr :: forall f. Control.Applicative f => -- (String %1-> f String) -> Classroom %1-> f Classroom -- traverseClassStr onName (Classroom cname teachname x students texts) = -- Classroom <$> -- pure cname <*> -- onName teachname <*> -- pure x <*> -- traverse' (\(Student s i) -> Student <$> onName s <*> pure i) students <*> -- pure texts -- @ module Control.Optics.Linear.Traversal ( -- * Types Traversal, Traversal', -- * Composing optics (.>), -- * Common optics traversed, -- * Using optics over, overU, traverseOf, traverseOfU, -- * Constructing optics traversal, ) where import Control.Optics.Linear.Internal