I was thinking of a solution like yours after my previous mail. I ended up 
with something more or less similar to your solution. And then, I went to 
this solution :

filterRow: Int -> List Box -> Maybe Box
filterRow boxId row =
  row
  |> List.filter (\box -> box.id == boxId && not (box.player == Nothing))
  |> List.head

update: Msg -> Model -> (Model, Cmd Msg)
update msg model =
    case msg of
        None ->
            (model, Cmd.none)
        
        ClickBox boxId ->
            let
              currentBox = List.map (filterRow boxId) model.cells |> 
List.head
              
              updateRow row =
                let
                  updateBox box =   
                    if boxId == box.id then
                      {box | player = Just model.current}
                    else
                      box
                in
                  List.map updateBox row
            in
            case currentBox of
              Nothing ->
                ({model | cells = List.map updateRow model.cells, current = 
changePlayer model.current, boxClicked = Just boxId}, Cmd.none)
              Just _ ->
                (model, Cmd.none)

The idea is to return in currentBox a box which is not occupied by a 
player. So I added the following test : List.filter (\box -> box.id == 
boxId && not (box.player == Nothing)) in filterRow.

But It seems that, in the update function, currentBox always return 
something because it doesn't update my model... I'm obviously doing 
something wrong. But, for me, as all cells are unoccupied, this test should 
return Nothing. What's wrong ?

I also fixed the boxStyle function in order to display the shapes correctly 
:

boxStyle player =
  case player of
    Nothing -> 
      [
          ("border", "1px solid black")
         ,("width", "64px")
         ,("height", "64px")
         ,("display", "inline-block")
      ]
    Just p ->
      [
          ("border", "1px solid black")
         ,("width", "64px")
         ,("height", "64px")
         ,("display", "inline-block")
         ,("background-size", "64px 64px")
         ,("background-image", 
"url(http://jimdscott.com/static/images/tic-tac-toe-"; ++ p.shape ++ ".png)")
      ]

I'm sorry, but I don't know how to debug elm code in general, and in 
particular with the elm lang try editor (I'm at work and I don't have elm 
working on my machine...)


Le mardi 25 octobre 2016 23:30:45 UTC+2, Peter Damoc a écrit :
>
>
>
> On Tue, Oct 25, 2016 at 11:12 PM, Did <didier...@gmail.com <javascript:>> 
> wrote:
>
>> Now is the hardest part for me : the update function. Since elm is a 
>> functional language, I suppose I have to recreate a new cells list with the 
>> value of the box concerned by the click. In OOP languages, I'd just take 
>> the reference of the box from the list, change the player and that's it...  
>> Here is the update function with some not working changes...
>>
>> CELLS_WITH_BOX_UPDATED would be the new cells list updated but I don't 
>> understand how to do this...
>>
>
>  `cells` is a list of lists. 
> updated cells would mean that you would have to update all the list in the 
> main list, in other words, update every row 
>
> let 
>     currentBox = List.map (filterRow boxId) model.cells
>     updateRow row = List.map (\box -> if boxId == box.id then {box | 
> shape = Just model.current } else box) row   
> in 
>     case currentBox of 
>         Nothing -> 
>             { model | cells = List.map updateRow model.cells, current = 
> changePlayer 
> model.current }    
>         Just _ -> 
>             model  -- nothing changes (cannot click over a previous ticked 
> cell)
>
>
>
> -- 
> There is NO FATE, we are the creators.
> blog: http://damoc.ro/
>

-- 
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 elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to