diff --git a/Bonsai.Sgen/Bonsai.Sgen.csproj b/Bonsai.Sgen/Bonsai.Sgen.csproj
index 3175958..1464524 100644
--- a/Bonsai.Sgen/Bonsai.Sgen.csproj
+++ b/Bonsai.Sgen/Bonsai.Sgen.csproj
@@ -4,7 +4,7 @@
Exe
net6.0
enable
- 0.1.0
+ 0.2.0
enable
diff --git a/Bonsai.Sgen/CSharpClassTemplate.cs b/Bonsai.Sgen/CSharpClassTemplate.cs
index 3513607..ea8031f 100644
--- a/Bonsai.Sgen/CSharpClassTemplate.cs
+++ b/Bonsai.Sgen/CSharpClassTemplate.cs
@@ -153,7 +153,37 @@ public string Render()
{{
{propertyAssignments}
}})"))));
+
+ var genericTypeParameter = new CodeTypeParameter("TSource");
+ var genericSourceParameter = new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(IObservable<>))
+ {
+ TypeArguments = { new CodeTypeReference(genericTypeParameter) }
+ }, "source");
+ var genericProcessMethod = new CodeMemberMethod
+ {
+ Name = "Process",
+ Attributes = MemberAttributes.Public | MemberAttributes.Final,
+ TypeParameters = { genericTypeParameter },
+ Parameters = { genericSourceParameter },
+ ReturnType = new CodeTypeReference(typeof(IObservable<>))
+ {
+ TypeArguments = { new CodeTypeReference(Model.ClassName) }
+ }
+ };
+ genericProcessMethod.Statements.Add(new CodeMethodReturnStatement(
+ new CodeMethodInvokeExpression(
+ new CodeMethodReferenceExpression(
+ new CodeTypeReferenceExpression("System.Reactive.Linq.Observable"),
+ "Select"),
+ new CodeVariableReferenceExpression(genericSourceParameter.Name),
+ new CodeSnippetExpression(
+ @$"_ => new {Model.ClassName}
+ {{
+{propertyAssignments}
+ }}"))));
+
type.Members.Add(processMethod);
+ type.Members.Add(genericProcessMethod);
type.CustomAttributes.Add(new CodeAttributeDeclaration(
new CodeTypeReference("Bonsai.CombinatorAttribute")));
type.CustomAttributes.Add(new CodeAttributeDeclaration(