entryAt method
The entry for new-theme step step under the current filter: a hero
on hero steps (every 8–12 steps, seeded), otherwise a generated theme
whose seed and family come from Rng.stream(feedSeed, 'feed/step/k').
While steering, steps from the one steer started at are generated under the intent from steeredFamilies (that first step centred), with no heroes.
Implementation
FeedEntry entryAt(int step) {
final intent = _intent;
if (intent != null && step >= _intentStep) {
final families = steeredFamilies;
final r = Rng.stream(feedSeed, RngTag.sub(RngTag.feed, 'step', step));
final seed = r.nextU32();
final family = families[r.nextInt(families.length)];
final recipe = intent.forEntry;
return recipe.isEmpty
? FeedEntry.generated(seed: seed, family: family)
: FeedEntry.generated(
seed: seed,
family: family,
intent: recipe,
centred: step == _intentStep,
);
}
final families = _filter.families;
final heroIndex = _heroIndexAt(step);
if (heroIndex != null) {
final order = _heroOrderIds();
final allowed = [
for (final id in order)
if (families.contains(heroById(id)!.family)) id,
];
if (allowed.isNotEmpty) {
return FeedEntry.hero(allowed[heroIndex % allowed.length]);
}
}
final r = Rng.stream(feedSeed, RngTag.sub(RngTag.feed, 'step', step));
final seed = r.nextU32();
final family = families[r.nextInt(families.length)];
return FeedEntry.generated(seed: seed, family: family);
}