parseDialogNode = ({ dialogNode, systems, shot, speakerToThangTypeSlugMap }) => {
  const dialogCommands = Object.values(systems)
    .filter(sys => sys !== undefined && typeof sys.parseDialogNode === 'function')
    .reduce((commands, sys) => {
      const dialogCommands = sys.parseDialogNode(dialogNode, shot, speakerToThangTypeSlugMap)
      if (!Array.isArray(dialogCommands)) {
        throw new Error('Your system should always return an array of commands for a dialogNode')
      }
      return [...commands, ...dialogCommands]
    }, [])
  return [new ConcurrentCommands(dialogCommands)]
}
Returns an array of commands.
This is required as we update this list to add commands to the start and end.
@param {Object} arg
@param {DialogNode} arg.dialogNode
@param {Object} arg.systems
@param {Object} arg.shot the current shot
@returns {AbstractCommand[]}