Sharpify 1.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Sharpify --version 1.1.0                
NuGet\Install-Package Sharpify -Version 1.1.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Sharpify" Version="1.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Sharpify --version 1.1.0                
#r "nuget: Sharpify, 1.1.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Sharpify as a Cake Addin
#addin nuget:?package=Sharpify&version=1.1.0

// Install Sharpify as a Cake Tool
#tool nuget:?package=Sharpify&version=1.1.0                

Sharpify

A collection of high performance language extensions for C#

Features

  • 🀷 Either<T0, T1> - Discriminated union object that forces handling of both cases
  • 🦾 Flexible Result type that can encapsulate any other type and adds a massage options and a success or failure status. Flexible as it doesn't require any special handling to use (unlike Either)
  • πŸš€ Extremely efficient concurrency with Concurrent collection wrapper and IAction/IAsyncAction interfaces
  • πŸ„ Wrapper extensions that simplify use of common functions and advanced features from the CollectionsMarshal class
  • Routine and AsyncRoutine bring the user easily usable and configurable interval based background job execution.
  • PersistentDictionary and derived types are super lightweight and efficient serializable dictionaries that are thread-safe and work amazingly for things like configuration files.
  • SortedList<T> bridges the performance of List and order assurance of SortedSet
  • 🧡 ThreadSafe<T> makes any variable type thread-safe
  • πŸ” AesProvider provides access to industry leading AES-128 encryption with virtually no setup
  • πŸ‹οΈ High performance optimized alternatives to core language extensions
  • 🎁 More added features that are not present in the core language
  • ❗Parameter validation is handled with Debug.Assert statements instead of Exception throwing to increase performance in Release builds
  • 🫴 Focus on giving the user complete control by using flexible and common types, and resulting types that can be further used and just viewed.

More on Concurrent

The interfaces IAction and IAsyncAction allow usage of readonly structs to represents the actual lambda function alternative, in addition of possibly being allocated on the stack, it also allows usage of readonly field and provides clarity for the JIT compiler allowing it to optimize much more during runtime than if it were lambda functions. The Concurrent wrapper serves 3 purposes: first is separating the extensions of this library from the rest of parallel core extensions, to make sure you really are using the one you want. Second is to limit actual types of collections you could use, In order to maximize the performance only collections that implement ICollection<T> can be used. Third is that wrapping the collection as a field in a ref struct sometimes helps allocate more of the actual processing dependencies on the stack, and most of the time even if not, it will allocate the pointer to the stack which will help the JIT to further optimize during runtime.

More on Result

Result is a readonly record struct that includes a bool status of either success or failure and an optional string message. In addition to that there is an alternative Result<T> which can also store a value of type T. The result class uses static factory methods to create both Result and Result<T> objects, and implicit converters minimize complexity and unreadability of code.

Unlike Either<T0, T1>, Result does force the user to handle it in any special way, instead nullable properties are used. both Result.Message and Result.Value (if Result<T> is used) can be null, and the factory methods for Fail set the Value to null. So that in the worst case you only allocate a null reference.

All of these design choices guarantee vastly improved performance over Either<T0, T1> since, you can use any objects during the handling of the result, or pass the result entirely or just parts of it between methods without worrying of boxing and heap allocations from lambdas

More on ThreadSafe<T>

  • Access the value by using ThreadSafe<T>.Value
  • Modify the value by using ThreadSafe<T>.Modify(Func<T, T>) or ThreadSafe<T>.Modify(IModifier<T>)
  • IModifier<T> allows you to create an operation that will be better optimized than a Func<T, T> and possibly avoid the memory allocation penalty associated with delegates
  • Unlike the Interlocked api's, which require using ref thus making them unusable in async methods, ThreadSafe<T> doesn't, which makes it much more usable

More on AesProvider

  • Has string key based constructor that takes care of the headache for padding and key size for you
  • Has methods for encrypting and decrypting both strings and byte[]s
  • Provides an option to generate an ICryptoTransform for either encryption or decryption to fit special needs
  • Properly implements IDisposable with api notices to prevent memory leaks
  • Has static methods for generating hashed passwords and validating them

More on the Utils class

  • Adds an option for calculating rolling average for double
  • Adds new interfaces to access DateTime.Now using GetCurrentTimeAsync and GetCurrentTimeInBinaryAsync, as using the default ones involves a system call and it is blocking, it actually takes quite a bit of time, from my testing about 180ns, the new functions allow calling to a variable and not awaiting them, then later awaiting the actual variable to either get the value or wait for it to complete and get the value. This allows you to actually do other things while awaiting this system call. It can make a big difference in high-performance scenarios where you use `DateTime.Now to also get a timestamp
Contact

For bug reports, feature requests or offers of support/sponsorship contact dusrdev@gmail.com

Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net7.0

    • No dependencies.
  • net8.0

    • No dependencies.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on Sharpify:

Package Downloads
PrettyConsole

High performance, feature rich and easy to use wrap over System.Console

Sharpify.Data

An extension of Sharpify, focused on Data

Sharpify.CommandLineInterface

An extension of Sharpify, focused on creating command line interfaces

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2.5.0 307 11/13/2024
2.4.0 414 10/21/2024
2.4.0-alpha 187 10/8/2024
2.2.0 554 7/26/2024
2.1.0 93 7/18/2024
2.0.0 157 6/3/2024
1.8.1 113 5/30/2024
1.8.0 124 4/17/2024
1.7.3 186 1/29/2024
1.7.2 129 1/23/2024
1.7.1 245 1/20/2024
1.7.0 100 1/20/2024
1.6.0 137 1/15/2024
1.5.0 122 1/10/2024
1.4.2 127 1/8/2024
1.4.1 167 1/4/2024
1.4.0 148 1/4/2024
1.3.1 139 12/31/2023
1.3.0 138 12/31/2023
1.2.0 139 12/24/2023
1.1.0 160 12/7/2023
1.0.9 124 12/7/2023
1.0.8 162 11/22/2023
1.0.7 134 9/23/2023
1.0.6 154 8/21/2023
1.0.5 169 5/4/2023
1.0.4 166 4/23/2023
1.0.3 172 4/19/2023
1.0.2 177 4/19/2023
1.0.1 185 4/14/2023
1.0.0 180 4/14/2023