Skip to content

Instantly share code, notes, and snippets.

Avatar
🌴

David Fowler davidfowl

🌴
View GitHub Profile
View Quic.cs
using System.IO.Pipelines;
using System.Net;
using System.Net.Security;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core;
var builder = WebApplication.CreateBuilder(args);
@davidfowl
davidfowl / DTO.cs
Last active Sep 26, 2021
Associated types: A demo of what DTOs could look like as a language feature
View DTO.cs
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/todos", async (CreateTodo createTodo, TodoDb db) =>
{
// This is where the implicit conversion comes in
db.Todos.Add(createTodo);
@davidfowl
davidfowl / MinimalAPIs.md
Last active Jul 4, 2022
Minimal APIs at a glance
View MinimalAPIs.md
@davidfowl
davidfowl / Example.cs
Last active Jun 2, 2022
An implementation of MessagePipe. Something like a channel but with buffer management so you can peek and advance the message that was read.
View Example.cs
using System.Buffers;
using System.Net.WebSockets;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/ws", async (HttpContext context) =>
{
const int MaxMessageSize = 1024 * 1024;
@davidfowl
davidfowl / server.cs
Last active Sep 20, 2021 — forked from DamianEdwards/server.cs
Simplified ASP.NET Core app exploration
View server.cs
#!/usr/bin/env dotnet run
var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;
var connString = config["connectionString"] ?? "Data Source=todos.db";
builder.AddDbContext<TodoDb>(options => options.UseSqlite(connString));
builder.AddSqlite<Todo>(connString) // Higher level API perhaps?
var app = builder.Build();
View ConcurrentDictionaryExtensions.cs
using System;
using System.Threading.Tasks;
namespace System.Collections.Concurrent
{
public static class ConcurrentDictionaryExtensions
{
/// <summary>
/// Provides an alternative to <see cref="ConcurrentDictionary{TKey, TValue}.GetOrAdd(TKey, Func{TKey, TValue})"/> that disposes values that implement <see cref="IDisposable"/>.
/// </summary>
@davidfowl
davidfowl / ModuleLoader.cs
Last active Mar 7, 2022
ModuleLoader: This handles concurrent requests adding modules and duplicates
View ModuleLoader.cs
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.Loader;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Infrastructure;
View Solution.cs
var t1 = DoFooAsync(obj);
var t2 = DoBarAsync(obj);
var t = await WhenAnySuccessOrAllFail(t1, t2);
async Task WhenAnySuccessOrAllFail(params Task[] tasks)
{
var remaining = new List<Task>(tasks);
while (remaining.Count > 0)
@davidfowl
davidfowl / trie.js
Last active Jan 13, 2022 — forked from sajclarke/trie.js
Building a trie using Javascript.
View trie.js
// Question: Implement a route matching enging
// Given a list of routes as a list of strings and a matching route, build a route matching engine
// that returns true if a path matches.
const routes = ['/foo/blah/bar', '/foo', '/products']
function buildTrie(routes) {
var root = { path: {} };
for (var route of routes) {
var node = root;