I'm sorry. Don't why your answer wasn't loaded that day. Aren't "set and unset whenever processing is started/finished" side-effects? We can do that easily in imperative languages but all functions in ELM are pure.
Vào 03:55:33 UTC+7 Thứ Ba, ngày 11 tháng 10 năm 2016, OvermindDL1 đã viết: > > 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.
