workflow.md

Личный сайт Go-разработчика из Казани

Простой конечный автомат, похожий на Symfony Workflow.

Пример

1o := new(ObjectImplementedPlaceer) 2 3w := NewWorkflow("Start") 4w.AddTransition("Start", "A") 5w.AddTransition("Start", "B") 6w.AddTransition("A", "C") 7w.AddTransition("B", "D") 8w.AddTransition( "C", "D") 9w.AddTransition("C", "Finish") 10w.AddTransition("D", "Finish") 11 12w.Can(o, "A") // == nil 13w.Can(o, "C") // == ErrTransitionNotFound 14 15w.GetEnabledTransitions(o) // []Place{"A", "B"} 16w.Apply(o, "A") // o now at "A" place 17w.GetEnabledTransitions(o) // []Place{"C"} 18 19w.DumpToDot() // See above

Дамп в формат dot

digraph {
    Start[color="blue"]
    Start -> A[label="Start → A"];
    Start -> B[label="Start → B"];
    A -> C[label="A → C"];
    B -> D[label="B → D"];
    C -> D[label="C → D"];
    C -> Finish[label="C → Finish"];
    D -> Finish[label="D → Finish"];
}
digraph {
    Start[color="blue"]
    Start -> A[label="Start → A"];
    Start -> B[label="Start → B"];
    A -> C[label="A → C"];
    B -> D[label="B → D"];
    C -> D[label="C → D"];
    C -> Finish[label="C → Finish"];
    D -> Finish[label="D → Finish"];
}