docs: def replay_sgf(sgf_contents):
      """Wrapper for sgf files, returning go.PositionWithContext instances.
  
      It does NOT return the very final position, as there is no follow up.
      To get the final position, call pwc.position.play_move(pwc.next_move)
      on the last PositionWithContext returned.
  
      Example usage:
      with open(filename) as f:
          for position_w_context in replay_sgf(f.read()):
              print(position_w_context.position)
      """
      root_node = get_sgf_root_node(sgf_contents)
      props = root_node.properties
      assert int(sgf_prop(props.get('GM', ['1']))) == 1, "Not a Go SGF!"
  
      komi = 0
      if props.get('KM') is not None:
          komi = float(sgf_prop(props.get('KM')))
      result = utils.parse_game_result(sgf_prop(props.get('RE', '')))
  
      pos = Position(komi=komi)
      current_node = root_node
      while pos is not None and current_node.next is not None:
          pos = handle_node(pos, current_node)
          maybe_correct_next(pos, current_node.next)
          next_move = get_next_move(current_node)
          yield PositionWithContext(pos, next_move, result)
          current_node = current_node.next