selfTrain :: NNet -> NNet
  -> DecodeT
    (WriterT (Endo [(M.Map Player (Actor Identity),Board)]) Identity)
    Board
selfTrain t s = do
  ~(start,players) <- modelDecode
    [(1,(startBoard2,[Blue,Red])),(1,(startBoard3,[Blue,Green,Red]))]
  student <- modelDecode $
    map (\x -> (1,x)) players
  let
    teacherA = Teacher 0.5 t
    studentA = Student 0.5 s
    actors = M.insert student studentA $ M.fromList $ map
      (\p -> (p,teacherA))
      players
  lift $ tell $ Endo ((actors,start):)
  continueGame Blue start actors
selfTrain :: NNet -> NNet
  -> DecodeT
    (WriterT (Endo [(M.Map Player (Actor Identity),Board)]) Identity)
    Board
selfTrain t s = do
  ~(start,players) <- modelDecode
    [(1,(startBoard2,[Blue,Red])),(1,(startBoard3,[Blue,Green,Red]))]
  student <- modelDecode $
    map (\x -> (1,x)) players
  let
    teacherA = Teacher 0.5 t
    studentA = Student 0.5 s
    actors = M.insert student studentA $ M.fromList $ map
      (\p -> (p,teacherA))
      players
  lift $ tell $ Endo ((actors,start):)
  continueGame Blue start actors
selfTrain t s = do
  ~(start,players) <- modelDecode
    [(1,(startBoard2,[Blue,Red])),(1,(startBoard3,[Blue,Green,Red]))]
  student <- modelDecode $
    map (\x -> (1,x)) players
  let
    teacherA = Teacher 0.5 t
    studentA = Student 0.5 s
    actors = M.insert student studentA $ M.fromList $ map
      (\p -> (p,teacherA))
      players
  lift $ tell $ Endo ((actors,start):)
  continueGame Blue start actors