base on A collection of high performance language extensions for C# # Sharpify
A collection of high performance language extensions for C#, fully compatible with NativeAOT
## โฌ Installation
[](https://www.nuget.org/packages/Sharpify/)
> dotnet add package Sharpify
[](https://www.nuget.org/packages/Sharpify.Data/)
> dotnet add package Sharpify.Data
[](https://www.nuget.org/packages/Sharpify.CommandLineInterface/)
> dotnet add package Sharpify.CommandLineInterface
## Sharpify - Base package
`Sharpify` is a package mainly intended to extend the core language using high performance implementations. The other 2 packages uses `Sharpify` as a dependency. But its core features can be useful in a variety of applications by themselves.
* โก Fully Native AOT compatible
* ๐คท `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`)
* ๐ 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`
* `PersistentDictionary` and variants provide all simple database needs, with perfected performance and optimized concurrency.
* `SerializableObject` and the `Monitored` variant allow persisting an object to the disk, and elegantly synchronizing modifications.
* ๐ฟ `StringBuffer` enables zero allocation, easy to use appending buffer for creation of strings in hot paths.
* `RentedBufferWriter{T}` is an allocation friendly alternative to `ArrayBufferWriter{T}` for hot paths.
* A ๐ฃ๐ป boat load of extension functions for all common types, bridging ease of use and performance.
* `Utils.DateAndTime`, `Utils.Env`, `Utils.Math`, `Utils.Strings` and `Utils.Unsafe` provide uncanny convenience at maximal performance.
* ๐งต `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
* โ Static inner exception throwers guide the JIT to further optimize the code during runtime.
* ๐ซด Focus on giving the user complete control by using flexible and common types, and resulting types that can be further used and just viewed.
For more information check [inner directory](src/Sharpify/README.md).
## Sharpify.Data
`Sharpify.Data` is an extension package, that should be installed on-top of `Sharpify` and adds a high performance persistent key-value-pair database, utilizing [MemoryPack](https://github.com/Cysharp/MemoryPack). The database support multiple types in the same file, 2 stage AES encryption (for whole file and per-key). Filtering by type, Single or Array value per key, and more...
* `Database` is the base type for the data base, it is key-value-pair based local database - saved on disk.
* `IDatabaseFilter<T>` is an interface which acts as an alternative to `DbContext` and provides enhanced type safety for contexts.
* `MemoryPackDatabaseFilter<T>` is an implementation which focuses on types that implement `IMemoryPackable<T>` from `MemoryPack`.
* `FlexibleDatabaseFilter<T>` is an implementation focusing on types which need custom serialization logic. To use this, you type `T` will need to implement `IFilterable<T>` which has methods for serialization and deserialization of single `T` and `T[]`. If you can choose to implement only one of the two.
* **Concurrency** - `Database` uses highly performant synchronous concurrency models and is completely thread-safe.
* **Disk Usage** - `Database` tracks inner changes and skips serialization if no changes occurred, enabling usage of periodic serialization without resource waste.
* **GC Optimization** - `Database` heavily uses pooling for encryption, decryption, type conversion, serialization and deserialization to minimize GC overhead, very rarely does it allocate single-use memory and only when absolutely necessary.
* **HotPath APIs** - `Database` is optimized for hot paths, as such it provides a number of APIs that specifically combine features for maximum performance and minimal GC overhead. Like the `TryReadToRentedBuffer<T>` methods which is optimized for adding data to a table.
* **Runtime Optimization** - Upon initialization, `Database` chooses specific serializers and deserializers tailored for specific configurations, minimizing the amount of runnable code during runtime that would've been wasted on different checks.
For more information check [inner directory](src/Sharpify.Data/README.md).
## Sharpify.CommandLineInterface
`Sharpify.CommandLineInterface` is another extension package that adds a high performance, reflection free and `AOT-ready` framework for creating command line and embedded interfaces
* Maintenance friendly model that depends on class that implement `Command` or `SynchronousCommand`
* `Arguments` is an abstraction layer over the inputs that validate during runtime according to user needs via convenient APIs.
* Configuration using a fluent builder pattern.
* Configurable output and input pipes, enable usage outside of `Console` apps, enabling the option for embedded use in any application.
* Automatic and structured general and command-specific help text.
* Configurable error handling with defaults.
* Super lightweight
For more information check [inner directory](src/Sharpify.CommandLineInterface/README.md)
## Methodology
* Backwards compatibility โ
* Stability at release โ
As the name suggests - `Sharpify` intends to extend the core language features using high performance implementations. `Sharpify` or its extension packages are not guaranteed to be backwards compatible, and each release may contain breaking changes as they try to adapt to the latest language features. `.NET` has a very active community and many features will be added to the core language that will perform at some point better than what `Sharpify` currently offers, at which point these features will be removed from `Sharpify` to encourage users to use the core language features instead.
The decision to disregard backwards compatibility is based on the idea to only provide feature that **add** or **improve** current language features. This is to ensure that both the package remains relevant, and unbounded by old sub-par implementations, and to encourage users to adapt their code to new language features.
Even thought backwards compatibility is not guaranteed, `Sharpify` has very high coverage of unit tests, and should be completely stable upon release. All issues will be treated as **Urgent**.
If your packages / libraries use `Sharpify`, and you don't want to modify the code often, I recommend locking the dependency to a specific version which you test.
## Contribution
This packages was made public so that the entire community could benefit from it. If you experience issues, want to suggest new features or improve existing ones, please use the [issues](https://github.com/dusrdev/Sharpify/issues) section.
## Contact
For bug reports, feature requests or offers of support/sponsorship contact <
[email protected]>
> This project is proudly made in Israel ๐ฎ๐ฑ for the benefit of mankind.
", Assign "at most 3 tags" to the expected json: {"id":"7217","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"