Skip to content

Instantly share code, notes, and snippets.

@NickStrupat
NickStrupat / Rented.cs
Last active December 17, 2024 14:53
Rented
public interface IRented<T> : IDisposable
{
Memory<T> Memory { get; }
Span<T> Span { get; }
}
public static class ArrayPoolExtensions
{
public static IRented<T> GetRented<T>(this ArrayPool<T> pool, int minimumLength, bool clearOnReturn = false)
{
@NickStrupat
NickStrupat / Program.cs
Last active December 4, 2024 21:21
JSON serialization of a stream
using System.Buffers.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
var text = "Hello, World! How are ya? Good! That's swell!"u8;
{
using var ms = new MemoryStream(text.ToArray());
var foo = new Foo("text", ms);
using var fs = File.Create("yes.txt", 4096, FileOptions.WriteThrough);
JsonSerializerOptions jso = new() { Converters = { new StreamToBase64WriteOnlyJsonConverter(fs) }};
@NickStrupat
NickStrupat / TestCaseAttribute_1.cs
Created November 20, 2024 03:32
Generic test case attribute for NUnit
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class TestCaseAttribute<T>(params Object?[]? arguments) : TestCaseAttribute(arguments), ITestBuilder
{
IEnumerable<TestMethod> ITestBuilder.BuildFrom(IMethodInfo method, Test? suite)
{
if (!method.IsGenericMethodDefinition)
return base.BuildFrom(method, suite);
var length = method.GetGenericArguments().Length;
if (length != 1)
using System;
public readonly struct PrimeQuadraticResiduePermuter32(UInt32 seed)
{
public UInt32 this[UInt32 x] => Permute(Permute(unchecked(x + seed)) ^ Xor);
private const UInt32 Xor = 0x5bf03635;
private static UInt32 Permute(UInt32 x)
{
@NickStrupat
NickStrupat / AsyncLock.cs
Last active August 4, 2024 07:07
AsyncLock
using System;
using System.Threading;
using System.Threading.Tasks;
/// <summary>
/// A simple FIFO async lock. It does not support recursion/reentrancy.
/// </summary>
public sealed class AsyncLock
{
private Task task = Task.CompletedTask;
@NickStrupat
NickStrupat / OnceThenOther.cs
Created July 9, 2024 20:49
A thread-safe utility class that returns the `once` value once ever, and then the `other` value from then on.
public sealed class OnceThenOther<T>(T once, T other)
{
private Int32 flag = 0;
// Checking the flag value normally before exchanging it atomically is an optimization with two parts:
// A) Contentious first access will all synchronize on the atomic exchange
// B) Subsequent accesses will see the local cached value of `1`, so they won't have to perform the heavier atomic exchange
public T Value => flag == 0 && Interlocked.Exchange(ref flag, 1) == 0 ? once : other;
}
@NickStrupat
NickStrupat / ChatBot.csproj
Last active July 8, 2024 14:13
C# Chat bot powered by Llama 3 through Ollama
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
</PropertyGroup>
@NickStrupat
NickStrupat / InterfaceImplementor.cs
Created August 28, 2021 21:26
Pass an interface type and receive an instance of a run-time-emitted class which implements the interface.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
public static class InterfaceImplementor
@NickStrupat
NickStrupat / ExpandoObjectExtensions.cs
Last active October 13, 2020 19:16
Extend ExpandoObject to control assignment by hooking INotifyPropertyChanged
public static class Extensions
{
public static ExpandoObject WithAutoCorrect(this ExpandoObject eo)
{
(eo as INotifyPropertyChanged).PropertyChanged += Handler;
return eo;
static void Handler(object sender, PropertyChangedEventArgs e)
{
var dict = (IDictionary<String, Object>)sender;
@NickStrupat
NickStrupat / DictionaryObjectExtensions.cs
Last active October 9, 2020 16:51
Dictionary to object
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
public static class DictionaryObjectExtensions
{