class CookieJarTag extends Context.Tag('CookieJar')<CookieJarTag, Ref.Ref<CookieJar>>() {}
// within network lib impl:
E.bind('cookieJarRef', () => CookieJarTag),
// getting the cookie is a little verbose but works fine
E.bind('cookie', ({ cookieJarRef, url }) => Ref.get(cookieJarRef).pipe(
E.flatMap((cookieJar) => E.promise(() => cookieJar.getCookieString(url.href))),
E.map(O.liftPredicate(Str.isNonEmpty)),
)),
// setting the cookie requires two separate operations, creating a race condition with other network calls
E.tap(({ cookieJarRef, url, setCookie }) => Ref.get(cookieJarRef).pipe(
E.tap((cookieJar) => E.promise(async () => cookieJar.setCookie(cookie, url.href))),
E.flatMap((cookieJar) => Ref.set(cookieJarRef, cookieJar)),
)),
class CookieJarTag extends Context.Tag('CookieJar')<CookieJarTag, Ref.Ref<CookieJar>>() {}
// within network lib impl:
E.bind('cookieJarRef', () => CookieJarTag),
// getting the cookie is a little verbose but works fine
E.bind('cookie', ({ cookieJarRef, url }) => Ref.get(cookieJarRef).pipe(
E.flatMap((cookieJar) => E.promise(() => cookieJar.getCookieString(url.href))),
E.map(O.liftPredicate(Str.isNonEmpty)),
)),
// setting the cookie requires two separate operations, creating a race condition with other network calls
E.tap(({ cookieJarRef, url, setCookie }) => Ref.get(cookieJarRef).pipe(
E.tap((cookieJar) => E.promise(async () => cookieJar.setCookie(cookie, url.href))),
E.flatMap((cookieJar) => Ref.set(cookieJarRef, cookieJar)),
)),