using System.Threading.Tasks;
using System.Threading.Tasks;
using System.Collections.Generic;
public static void onlyUnassignedIssues<TBacklogState>(Issue<Unassigned, TBacklogState> a)where TBacklogState : IBacklogState
public static void Main(string[] args)
Issue<Unassigned, InBacklog> unassigned = new Issue<Unassigned, InBacklog>();
onlyUnassignedIssues(unassigned);
Issue<Assigned, InBacklog> assigned = unassigned.assign(new Unassigned());
onlyUnassignedIssues(assigned);
Issue<Assigned, InBacklog> assigned2 = assigned.assign(new Assigned());
Issue<Unassigned, Todo> todo = unassigned.addToSprint(new InBacklog());
Issue<Assigned, Todo> assignedTodo = todo.assign(new Unassigned());
Issue<Assigned, Todo> movedToSprintAgain = assignedTodo.addToSprint(new Todo());
public interface IAssignedState
public class Assigned : IAssignedState
public class Unassigned : IAssignedState
public interface IAssignable<T, U>
public interface IBacklogState
public class InBacklog : IBacklogState
public class Todo : IBacklogState
public interface ITodoable<T, U>
public class Issue<TAssignableState, TBacklogState> : IAssignable<TAssignableState, Issue<Assigned, TBacklogState>>, ITodoable<TBacklogState, Issue<TAssignableState, Todo>> where TAssignableState : IAssignedState where TBacklogState : IBacklogState
public Issue<Assigned, TBacklogState> assign(TAssignableState t)
return new Issue<Assigned, TBacklogState>();
public Issue<TAssignableState, Todo> addToSprint(TBacklogState t)
return new Issue<TAssignableState, Todo>();