I'd set a flag on the model for when it is 'processing' (good flag name, maybe `isProcessing` or so?) and just test that in the model and set and unset it whenever processing is started/finished. :-)
Just think of it as another piece of 'state'. In fact if it can be gleaned from another piece of state (such as the animationframe being 'on') then check that instead, you do not want duplicate pieces in your model that hold essentially the same information, only have one place per piece of data. :-) On Monday, October 10, 2016 at 2:07:59 PM UTC-6, [email protected] wrote: > > The AnimationFrame works perfectly. Thank you :D > I have another question came in mind. How do you think can we make the > view display, for example "Thinking", while the minimax algorithm is being > executed? > > Thank you a lot for your help. :D > > Vào 00:11:59 UTC+7 Thứ Ba, ngày 11 tháng 10 năm 2016, OvermindDL1 đã viết: >> >> Most callbacks in a browser, such as the timeout used for Time, is >> throttled to 4ms and behaves strangely below 16ms, if you want to execute >> as fast as possible then you should use an AnimationFrame subscription. >> Time subscriptions should only be used for 500ms or larger or so, any less >> and it starts to act odd. >> >> You should probably still do a test to make sure it is the ai turn in >> your update for `AIMove` though, the browser can cache and send events >> 'later' than you expect as well. >> >> On Monday, October 10, 2016 at 11:06:07 AM UTC-6, [email protected] >> wrote: >>> >>> I just found a problem with using subscription though. I tried replace >>> second with millisecond, while the minimax was executing (about less than a >>> second) the program keep calling more AIMove. >>> >>> >>> subscriptions model = >>> if (gameIsNotFinished model && model.turn == AIToMove) then >>> Time.every millisecond AIMove >>> >>> >>> Vào 23:54:21 UTC+7 Thứ Hai, ngày 10 tháng 10 năm 2016, OvermindDL1 đã >>> viết: >>>> >>>> The example he put above is fine: :) >>>> ``` >>>> subscriptions : Model -> Sub Msg >>>> subscriptions model = >>>> if (gameIsNotFinished model && model.turn == AIToMove) then >>>> Time.every second AIMove >>>> else >>>> Sub.none >>>> ``` >>>> Though if you want it in another function you can do that too (useful >>>> to batch functionality together): >>>> ``` >>>> subAITick : Model -> Sub Msg >>>> subAITick model = >>>> if (gameIsNotFinished model && model.turn == AIToMove) then >>>> Time.every second AIMove >>>> else >>>> Sub.none >>>> >>>> subscriptions : Model -> Sub Msg >>>> subscriptions model = >>>> subAITick >>>> ``` >>>> Or if you have other subscriptions too, batching them together: >>>> ``` >>>> >>>> subscriptions : Model -> Sub Msg >>>> subscriptions model = >>>> Sub.batch >>>> [ subAITick >>>> ; otherSubscriptionsHere >>>> ] >>>> ``` >>>> >>>> >>>> On Monday, October 10, 2016 at 10:48:34 AM UTC-6, [email protected] >>>> wrote: >>>>> >>>>> Can you show code example :D I'm quite new to Elm and javascript. >>>>> >>>>> Vào 23:45:45 UTC+7 Thứ Hai, ngày 10 tháng 10 năm 2016, OvermindDL1 đã >>>>> viết: >>>>>> >>>>>> Yep, just call it from the subscriptions callback then. >>>>>> >>>>>> >>>>>> On Monday, October 10, 2016 at 10:36:58 AM UTC-6, [email protected] >>>>>> wrote: >>>>>>> >>>>>>> This is quite a good idea. But can we define our own function that >>>>>>> can return a Sub Msg? >>>>>>> >>>>>>> Vào 20:41:40 UTC+7 Thứ Hai, ngày 10 tháng 10 năm 2016, Wouter In t >>>>>>> Velt đã viết: >>>>>>>> >>>>>>>> (disclaimer: I am also quite new to Elm) >>>>>>>> I always try to avoid creating my own Cmd: there is usually a >>>>>>>> better, less bug-prone way to achieve this (e.g. with resursive update >>>>>>>> calls). >>>>>>>> >>>>>>>> That said: I can see the logic in having a Msg originating from a >>>>>>>> "real" player, and another Msg from your AI player. >>>>>>>> >>>>>>>> What you could do, is make a subscription to Time, that is only >>>>>>>> active if it is the AI's turn to move. >>>>>>>> That way, you get a) a delay before the AI makes a move + b) you do >>>>>>>> not need to create your own command >>>>>>>> Whenever it is the user's turn, or as soon as the game is over, the >>>>>>>> subscription is turned off. >>>>>>>> >>>>>>>> Something like this: >>>>>>>> >>>>>>>> subscriptions : Model -> Sub Msg >>>>>>>> subscriptions model = >>>>>>>> if (gameIsNotFinished model && model.turn == AIToMove) then >>>>>>>> Time.every second AIMove >>>>>>>> else >>>>>>>> Sub.none >>>>>>>> >>>>>>>> You would of course have to define your own functions to check if >>>>>>>> the game is still playing (no winner and no draw) and if it is the >>>>>>>> AI's >>>>>>>> turn to play. >>>>>>>> >>>>>>> -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
