Skip to content

Instantly share code, notes, and snippets.

View nelsonprsousa's full-sized avatar
:octocat:
Working from home

Nelson Sousa nelsonprsousa

:octocat:
Working from home
View GitHub Profile
@nelsonprsousa
nelsonprsousa / BaseLoader.cs
Last active January 29, 2022 18:19
Useful to avoid multiple requests to the same Task<T> (e.g. an HTTP GET operation). You probably want to registered the loader as a scoped or singleton service. Bare in mind that GetOrAdd is *not* atomic, although you can use your loader safely since it is thread-safe (usage of Lazy<Task<T>> to avoid multiple operations to resolve Task<T>).
public abstract class BaseLoader<T> : IBaseLoader<T>
where T : class
{
private readonly ConcurrentDictionary<string, Lazy<Task<T?>>> cache = new();
public Task<T?> LoadAsync(string key, Func<Task<T?>> factory)
{
return cache.GetOrAdd(key, (_) => new Lazy<Task<T?>>(factory)).Value;
}
}
@nelsonprsousa
nelsonprsousa / EnumerableExtensions.cs
Created May 30, 2023 18:59
ZipLongest returns a projection of tuples, where each tuple contains the N-th element from each of the argument sequences. The resulting sequence will always be as long as the longest of input sequences.
public static class EnumerableExtensions
{
public static IEnumerable<TResult> ZipLongest<TResult>(this IEnumerable<TResult> first, IEnumerable<TResult> second)
{
if (first == null)
{
throw new ArgumentNullException(nameof(first));
}
if (second == null)
@nelsonprsousa
nelsonprsousa / index.ts
Created July 8, 2024 18:46
Singleton with Qwik
import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
import type * as schema from './schema';
let _db!: PostgresJsDatabase<typeof schema> | null;
export function getDb(): PostgresJsDatabase<typeof schema> {
if (!_db) {
throw new Error('DB is not set in the singleton.');
}