module Counter =
                  
                  
                          type T(start) =
                  
                  
                              let mutable _counter = start
                  
                  
                              member _.count = _counter
                  
                  
                              member _.next() = _counter <- _counter + 1
                  
                  
                  
                  
                  
                      type T =
                  
                  
                       // тип string у этих "шагов" не более, чем условность (чисто для удобства)
                  
                  
                          | START
                  
                  
                          | S1 of string
                  
                  
                          | S2 of string
                  
                  
                          | S3 of string
                  
                  
                       // ...
                  
                  
                       // | S30  of  string
                  
                  
                          | FINISH
                  
                  
                          static member Length = typeof<T>
                  
                  
                                                 |> FSharp.Reflection.FSharpType.GetUnionCases
                  
                  
                                                 |> fun x -> x.Length
                  
                  
                      
                  
                  
                      let check (a: Counter.T) b =
                  
                  
                          if a.count <> b then
                  
                  
                              failwith
                  
                  
                              <| $"\n\n[ERROR] check a b | a.count=%i{a.count} b=%i{b}\n"
                  
                  
                          else
                  
                  
                              a.next ()
                  
                  
                  
                  
                  
                      let step cnt arg =
                  
                  
                          let check = check cnt
                  
                  
                  
                  
                  
                          match arg with
                  
                  
                          | START  -> check 0; arg
                  
                  
                          | S1 _   -> check 1; arg
                  
                  
                          | S2 _   -> check 2; arg
                  
                  
                          | S3 _   -> check 3; arg
                  
                  
                          | FINISH -> check <| T.Length - 1; arg
                  
                  
                  
                  
                  
                      let test () =
                  
                  
                          let step = step <| Counter.T(0)
                  
                  
                          let echo x = printfn $"%A{x}"
                  
                  
                  
                  
                  
                          echo << step <| START
                  
                  
                          
                  
                  
                          echo "----------------------"
                  
                  
                          echo << step <| S1 "step 1"
                  
                  
                          //echo << step <| S1 "step 1"   // error
                  
                  
                          //echo << step <| FINISH        // error
                  
                  
                  
                  
                  
                          echo "----------------------"
                  
                  
                          echo << step <| S2 "step 2"
                  
                  
                          //echo << step <| S2 "step 2"   // error
                  
                  
                          //echo << step <| S1 "step 1"   // error
                  
                  
                          //echo << step <| FINISH        // error
                  
                  
                  
                  
                  
                          echo "----------------------"
                  
                  
                          echo << step <| S3 "step 3"
                  
                  
                          //echo << step <| S3 "step 3"   // error
                  
                  
                          //echo << step <| S2 "step 2"   // error
                  
                  
                          //echo << step <| S1 "step 1"   // error
                  
                  
                          //echo << step <| FINISH        // error
                  
                  
                          
                  
                  
                          echo "----------------------"
                  
                  
                          echo << step <| FINISH
                  
                  
                  
                  
                  
                  Steps.test ()
                  
                  
                  
                  
                  
                  а как-то поизящнее можно того же самого добиться?
                  
                  
                
а этот принтскрин для всех симулянтов, что попытаются огульно охаивать моё форматирование 🤣🤣🤣
Могу констатировать, что рост есть, но также есть и пространство для дальнейшего роста
Попробуй почитать про state machine, мб придет вдохновение
тебе не кажется, что это из пушки по воробьям (в рамках указанной задачи) ??
Обсуждают сегодня