selectMove :: (Monad m) => Double -> NNet -> Player -> Board ->
  DecodeT m Board
selectMove s n p b = let
  playing = whichPlayersFrom p b
  nextPlayer = cycle playing !! 1
  sf = case length playing of
    2 -> flip const
    3 -> \b a -> b*s + a
  in modelDecode $ map (\b' ->
    (uncurry sf (evaluate n nextPlayer b' M.! p),b')
   ) $ genMoves p b
selectMove :: (Monad m) => Double -> NNet -> Player -> Board ->
  DecodeT m Board
selectMove s n p b = let
  playing = whichPlayersFrom p b
  nextPlayer = cycle playing !! 1
  sf = case length playing of
    2 -> flip const
    3 -> \b a -> b*s + a
  in modelDecode $ map (\b' ->
    (uncurry sf (evaluate n nextPlayer b' M.! p),b')
   ) $ genMoves p b
selectMove s n p b = let
  playing = whichPlayersFrom p b
  nextPlayer = cycle playing !! 1
  sf = case length playing of
    2 -> flip const
    3 -> \b a -> b*s + a
  in modelDecode $ map (\b' ->
    (uncurry sf (evaluate n nextPlayer b' M.! p),b')
   ) $ genMoves p b