Skip to content

Instantly share code, notes, and snippets.

View dadhi's full-sized avatar
🎯
Focusing

Maksim Volkau dadhi

🎯
Focusing
View GitHub Profile
@dadhi
dadhi / ImZipper.cs
Created July 5, 2018 06:40
Persistent Zipper data-structure for the win in C#
using System;
public class Test
{
public static void Main()
{
var x = ImZipper<int>.Empty.Pre(1).Pre(2);
Console.WriteLine(x);
Console.WriteLine(x.Focus);
}
@dadhi
dadhi / main.cs
Last active September 28, 2022 15:04
Discriminated Union (sum-type, co-product) from Algebraic Data Types (ADT) for C# which is memory efficient, supports one-line sub-typing
using System;
using System.Collections.Generic;
using static System.Console;
namespace Union
{
class Program
{
public static void Main()
{
@dadhi
dadhi / Lens.cs
Last active February 23, 2024 09:41
Functional optics, e.g. Lens, in C# - to simplify access and modification for deep part of immutable value
/*
Inspired by: https://medium.com/@gcanti/introduction-to-optics-lenses-and-prisms-3230e73bfcfe
*/
using System;
using static System.Console;
public static class Program
{
public static void Main()
@dadhi
dadhi / ObjectPoolComparison.cs
Last active June 29, 2018 07:00
Simple object pool implementations benchmarked C# .NET
/*
StackPool is faster by far >10 times than ScanPool.
Other features:
- Does not consume memory from the start - it grows only when you Return object to it.
- Forgiving for no Return scenarios, that means when you not returning - memory is not consumed. So it is similar to `new`
- May be put a limit on depth, NOT tested yet.
*/
@dadhi
dadhi / StackPool.cs
Created June 12, 2018 12:48
Stack based object pool C# .NET tailored for performance and simplicity
using System;
using System.Threading;
using static System.Console;
public class Test
{
public static void Main()
{
var p = new StackPool<S>();
var s1 = Rent(p, "55");
@dadhi
dadhi / NugetPackagesPath.props
Created February 27, 2018 08:44
Gets the nuget package location
<!-- Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -->
<Project>
<PropertyGroup>
<!-- Respect environment variable for the NuGet Packages Root if set; otherwise, use the current default location -->
<NuGetPackageRoot Condition="'$(NuGetPackageRoot)' == ''">$(NUGET_PACKAGES)</NuGetPackageRoot>
<NuGetPackageRoot Condition="'$(NuGetPackageRoot)' == '' AND '$(OS)' == 'Windows_NT'">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageRoot Condition="'$(NuGetPackageRoot)' == '' AND '$(OS)' != 'Windows_NT'">$([System.Environment]::GetFolderPath(SpecialFolder.Personal))\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageRoot Condition="!HasTrailingSlash('$(NuGetPackageRoot)')">$(NuGetPackageRoot)\</NuGetPackageRoot>
</PropertyGroup>
</Project>
@dadhi
dadhi / EitherOr.cs
Created January 24, 2018 23:52
Struct Either with renaming in C#
using System;
public class C {
public Result<int>.Or M() =>
Result<int>.Left(2);
}
public class Result<T> : Either<T, Exception> {}
public class Either<L, R>
{
@dadhi
dadhi / FreeIOMonad.cs
Last active October 9, 2022 03:05
Example of Free IO monad in pure C# with separated re-usable monad implementation
/*
Modified from the original https://gist.github.com/louthy/524fbe8965d3a2aae1b576cdd8e971e4
- removed dependency on [language-ext](https://github.com/louthy/language-ext)
- separated monadic boilerplate, so you may concentrate on describing the operations and interpretation of the program
- removed `IO<A>.Faulted` to simplify the examples. It can be added back in straightforward manner.
Useful links:
- [John DeGoes: Beyond Free Monads - λC Winter Retreat 2017](https://www.youtube.com/watch?v=A-lmrvsUi2Y)
- [Free and tagless compared - how not to commit to a monad too early](https://softwaremill.com/free-tagless-compared-how-not-to-commit-to-monad-too-early)
@dadhi
dadhi / Cofree.cs
Last active December 28, 2017 08:08
C# Cofree experiments from John De Goes talk https://www.youtube.com/watch?v=R_nYc4FItcI
using System;
namespace FP
{
// final case class Cofree[F[_], A](head: A, tail: F[Cofree[F, A]])
public interface ICofree<F, _, A>
{
A Head { get; }
CofreeF Tail<CofreeF>() where CofreeF : ICofree<F, _, A>;
}
@dadhi
dadhi / PureCSharpIOMonad.cs
Last active January 14, 2018 18:31
Pure C# IO monad (original is using LanguageExt lib https://gist.github.com/louthy/524fbe8965d3a2aae1b576cdd8e971e4)
// Modified from the original https://gist.github.com/louthy/524fbe8965d3a2aae1b576cdd8e971e4
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
using static System.Linq.Enumerable;
using static IOExample.Unit;