[x] Reduces abstractions and eliminates a number of generics and nested classes.
[x] Automatically infer OnEnter/OnExit type correctly via capturing generics from extension methods. No more bugs because you specified the wrong type! Only change is that you need to call this.OnEnter((State? previous) => ...) instead of OnEnter<StateType>((previous) => ). There's also overloads that don't require you accept the previous/next state if you don't need it (99% of use cases).
[x] Updates the diagram generator to support syntax changes.
[x] [StateMachine] is now [LogicBlock(typeof(ConcreteState), Diagram = true)].
[x] New logic block analyzer to warn you if you forget the [LogicBlock] attribute.
[x] Refactors the example to demonstrate a conventional logic block state structure.
[x] Eliminates the complex Use selector binding that I never actually used in practice. If you were using it, sorry! I needed to eliminate the dependency on Microsoft.CSharp, and the features it was using with dynamic required that package. From what I learned, those bindings wouldn't be AOT-friendly, and all Chickensoft packages need to be AOT-friendly.
[x] Eliminates boxing inputs and outputs altogether, even in the bindings system. This means that the single input handler execution hot path is allocation-free!
[x] A single input never hits the heap now! An input is only queued if another input is already being processed.
[x] Pass all inputs and outputs by reference via in
[x] Updates start/stop logic to be more correct.
[x] No more lambda allocations when executing enter/exit or attach/detach callbacks.
[x] Introduces a new source Introspection generator that registers all visible types and generates additional metadata information about types tagged with the [Meta] attribute.
[x] Adds a Serialization package that provides a type resolver for introspective types which supports polymorphic deserialization with 0 configuration.
[x] Source generated System.Text.Json contexts can be used alongside the Chickensoft serialization system.
[x] Serializable types can be versioned and marked as outdated. Upgrade logic is invoked during deserialization so that outdated models are never presented to production code.
[x] Support serializable type upgrade dependencies
[x] Support abstract introspective and serializable types
[x] Support serializable type inheritance.
[x] Allow user code and libraries to register custom metadata with the introspection type graph for types whose metadata cannot be automatically generated (i.e., types outside the user code assembly)
[x] Support init properties on serializable types, including required properties.
[x] Validate type graph after types are registered in the module initializer to warn or throw when user code attempts to do something invalid or not recommended.
[x] Introspection generator diagnostics to improve user friendliness
this.OnEnter((State? previous) => ...)
instead ofOnEnter<StateType>((previous) => )
. There's also overloads that don't require you accept the previous/next state if you don't need it (99% of use cases).[StateMachine]
is now[LogicBlock(typeof(ConcreteState), Diagram = true)]
.[LogicBlock]
attribute.Use
selector binding that I never actually used in practice. If you were using it, sorry! I needed to eliminate the dependency onMicrosoft.CSharp
, and the features it was using withdynamic
required that package. From what I learned, those bindings wouldn't be AOT-friendly, and all Chickensoft packages need to be AOT-friendly.in
[Meta]
attribute.init
properties on serializable types, includingrequired
properties.Testing
Documentation
Deployment