an enumerator
There are two ways to specify a guest list for a party. One is a doorman who checks each arriving person against the list and says yes or no, that is a recognizer. The other is a printer in the lobby that, left running, prints out the name of every guest, one after another, never stopping until all names (which may be infinitely many) have appeared, that is an enumerator. An enumerator is a Turing machine variant that, instead of taking an input and judging it, simply lists the members of a language on its output.
Formally, an enumerator is a Turing machine with a special printer-like output (and a work tape) but no input. It starts on a blank tape and runs forever, occasionally signalling 'this string is finished, print it'. The language of the enumerator E is exactly the set of strings it ever prints. Strings may appear in any order and may repeat; what matters is the set that eventually shows up. A key trick that makes this work for infinite languages without getting stuck is dovetailing: instead of fully exploring one candidate before the next, the machine interleaves work on many candidates, advancing each a little, so no single hard string can freeze the whole listing.
Enumerators give an alternative characterization of an important class: a language is Turing-recognizable if and only if some enumerator lists it. This is why the recognizable languages are also called 'recursively enumerable' (often shortened to r.e.), they are exactly the languages something can enumerate. The honest subtlety: an enumerator does not have to print in sorted order, and you cannot in general tell when, or whether, a particular string will appear. If you could always force the listing into increasing order and detect 'I have passed where w should be', the language would be decidable, which is strictly stronger than merely recognizable.
An enumerator for {a^n : n >= 0} just prints epsilon (ε), a, aa, aaa, ... forever in increasing length. For a harder recognizable language whose membership tests can loop, the enumerator dovetails: it runs the membership test on string s_1 for 1 step, then on s_1, s_2 for 2 steps each, and so on, printing s whenever its test finally accepts.
Dovetailing lets one enumerator chase infinitely many candidates without any single loop trapping it.
An enumerator characterizes recognizable (r.e.) languages, not decidable ones. Being able to list every member eventually does not mean you can ever conclude a given non-member is absent.