const previousSlugs: string[] = []
yield* E.logInfo('slug exists, regenerating')
const results = yield* E.loop(existingSlug.value as string | undefined, {
while: (slug) => slug !== undefined,
step: (slug) =>
// `step` does not accept an effect
checkSlugExists(slug).pipe(
E.tap((slug) => E.logInfo('slug exists', slug)),
E.map(Option.getOrUndefined),
E.provide(BlogStore.Default),
E.runSync,
),
body: (slug) =>
E.gen(function* () {
previousSlugs.push(slug)
// regenerate needs access to all previous slugs
// and it calls Ai service thats why it's an option
const newSlug = yield* reGenerateSlug(previousSlugs).pipe(
E.flatten,
E.orElseFail(
() =>
new BlogPostDataError({
message: 'Generating new slug failed',
}),
),
)
yield* E.logInfo('new slug', newSlug.slug)
return newSlug.slug
}),
}).pipe(E.tap((results) => E.logInfo('loop results', results)))
if (results.length === 0) {
return yield* new BlogPostDataError({
message: 'No unique slug found',
})
}
const previousSlugs: string[] = []
yield* E.logInfo('slug exists, regenerating')
const results = yield* E.loop(existingSlug.value as string | undefined, {
while: (slug) => slug !== undefined,
step: (slug) =>
// `step` does not accept an effect
checkSlugExists(slug).pipe(
E.tap((slug) => E.logInfo('slug exists', slug)),
E.map(Option.getOrUndefined),
E.provide(BlogStore.Default),
E.runSync,
),
body: (slug) =>
E.gen(function* () {
previousSlugs.push(slug)
// regenerate needs access to all previous slugs
// and it calls Ai service thats why it's an option
const newSlug = yield* reGenerateSlug(previousSlugs).pipe(
E.flatten,
E.orElseFail(
() =>
new BlogPostDataError({
message: 'Generating new slug failed',
}),
),
)
yield* E.logInfo('new slug', newSlug.slug)
return newSlug.slug
}),
}).pipe(E.tap((results) => E.logInfo('loop results', results)))
if (results.length === 0) {
return yield* new BlogPostDataError({
message: 'No unique slug found',
})
}