Various custom types that can be useful when doing development.
This project comes with a Dev Container configuration that provides a complete, consistent development environment across Windows, macOS, and Linux.
-
Install requirements (one-time setup):
- VS Code
- Docker Desktop
- Install the Remote - Containers extension in VS Code
-
Open in container:
- Open this project in VS Code
- A notification appears → click "Reopen in Container"
- Wait for the container to build (5-10 minutes first time)
- You're ready! The container has:
- ✅ .NET SDK 10.0 (all target frameworks)
- ✅ All build tools (Nuke, GitVersion, CodeCov, Stryker)
- ✅ Pre-configured VS Code extensions
- ✅ Git & GitHub CLI
- ✅ Optimized caches for fast builds
No local .NET installation needed!
This project adheres to Semantic Versioning.
Major version zero (0.y.z) is for initial development. Anything MAY change at any time.
The public API SHOULD NOT be considered stable.
This project was born out of frustration encountered while developing a matching algorithm in a professional context. The goal of that project was to enable the effective matching of one or more temporary workers based on :
- the assignment dates
- the declared availability of collaborators.
- their qualification ...
With the team back then, it took several weeks to get this "planning matcher" to work properly and, at the time, I was not very happy with the result (specifically with the planning matching part of the algorithm).
That's how I started working on types from Candoumbe.Types.Calendar namespace.
All following features depend on Candoumbe.Types.Core package.
Calendar namespace contains various types related to calendar operations, such as:
DateTimeRange: a datetime range represents a interval between twoDateTimesDateOnlyRange: an interval between twoDateOnlysTimeOnlyRange: an interval between twoTimeOnlys
Numerics namespace contains various types useful when you want to work with very specific numeric values such as:
NonNegativeInteger: a type that can only hold non-negative integersPositiveInteger: a type that can only hold integer values greater than zero.
Strings namespace contains various string-like data
A StringSegmentLinkedList is a special IEnumerable<char>
implementation
that can be used to perform highly performant "replace"
classDiagram
direction RL
namespace Strings {
class StringSegmentNode {
+ ReadonlyMemory~char~ Value
}
class StringSegmentLinkedList {
- StringSegmentNode head
- StringSegmentNode tail
+ Append(ReadOnlySpan~char~) StringSegmentLinkedList
+ Append(StringSegmentLinkedList) StringSegmentLinkedList
+ Contains(ReadOnlySpan~char~) bool
+ Contains(Func~char,bool~) bool
+ Replace(Func~char,bool~ predicate, ReadOnlySpan~char~ newValue) StringSegmentLinkedList
+ Replace(Func~char,bool~ predicate, IReadOnlyDictionaryOfChar~ReadOnlyMemory~char~~ substitutions) StringSegmentLinkedList
+ Replace(char oldValue, char newValue) StringSegmentLinkedList
+ Replace(char oldValue, ReadOnlySpan<char> newValue) StringSegmentLinkedList
+ Replace(ReadOnlySpan~char~ oldValue, ReadOnlySpan<char> newValue) StringSegmentLinkedList
}
}
IEnumerableOfReadOnlyMemory~char~ <|-- StringSegmentLinkedList
StringSegmentLinkedList "1" --> "1" StringSegmentNode: head
StringSegmentLinkedList "0" .. "1" StringSegmentNode: tail
Contributions are welcome! Feel free to submit issues or pull requests to improve the project. License
This project is licensed under the MIT License. See the LICENSE file for more details.