+ memory, no matter how long the lines are.
+
+ As this example shows, one superficial difference from @Data.Text.Lazy@
+ is that many of the operations, like 'lines',
+ are \'lensified\'; this has a number of advantages where it is possible, in particular
+ it facilitates their use with 'Parser's of Text in the general pipes sense.
+ Each such expression reduces to the naturally corresponding function when
+ used with @view@ or @(^.)@.
+
+ A more important difference the example reveals is in the types closely associated with
+ the central type, @Producer Text m r@. In @Data.Text@ and @Data.Text.Lazy@
+ we find functions like
+
+> splitAt :: Int -> Text -> (Text, Text)
+> lines :: Int -> Text -> [Text]
+
+ which relate a Text with a pair or list of Texts. The corresponding functions here (taking
+ account of \'lensification\') are
+
+> view . splitAt :: (Monad m, Integral n)
+> => n -> Producer Text m r -> Producer Text.Text m (Producer Text.Text m r)
+> view lines :: Monad m => Producer Text m r -> FreeT (Producer Text m) m r
+
+ In the type @Producer Text.Text m (Producer Text.Text m r)@ the second
+ element of the \'pair\' of of \'effectful Texts\' cannot simply be retrieved
+ with 'snd'. This is an \'effectful\' pair, and one must work through the effects
+ of the first element to arrive at the second. Similarly in @FreeT (Producer Text m) m r@,
+ which corresponds with @[Text]@, on cannot simply drop 10 Producers and take the others;
+ we can only get to the ones we want to take by working through their predecessors.
+
+ Some of the types may be more readable if you imagine that we have introduced
+ our own type synonyms
+
+> type Text m r = Producer T.Text m r
+> type Texts m r = FreeT (Producer T.Text m) m r
+
+ Then we would think of the types above as
+
+> view . splitAt :: (Monad m, Integral n) => n -> Text m r -> Text m (Text m r)
+> view lines :: (Monad m) => Text m r -> Texts m r
+
+ which brings one closer to the types of the similar functions in @Data.Text.Lazy@
+