async.ps1

function UpdateStatus() {
  $pure._state.repoDir = GetRepoDir

  if ($pure._state.repoDir) {
    $pure._state.isPending = $true
    &$pure._functions.log "Scheduling OnIdle event"

    $null = Register-EngineEvent -SourceIdentifier PowerShell.OnIdle -MaxTriggerCount 1 -Action $OnIdleCallback
  }
}

$Script:OnIdleCallback = {
  param ([bool] $isTest = $false)

  &$pure._functions.log "Running OnIdle event"
  $newStatus = &$pure._functions.getStatus $pure._state.repoDir

  if (Compare-Object $pure._state.status.values $newStatus.values) {
    &$pure._functions.log "Updating prompt.."
    $pure._state.status = $newStatus

    $isTest ? (&prompt) : [Microsoft.PowerShell.PSConsoleReadLine]::InvokePrompt()
  }
  $pure._state.isPending = $false
}

$Script:UpdateOnChange = {
  if (
    $pure._state.isPending -or
    $Event.SourceEventArgs.Name -match '\.git$' -or
    $Event.SourceEventArgs.Name -like '.git*.lock'
  ) { return }
  &$pure._functions.log "Change detected ($($Event.SourceEventArgs.Name))"

  &$Global:pure._functions.updateStatus
}

$Script:Fetch = {
  if ($pure._state.repoDir) {
    &$pure._functions.log "Running git fetch"
    git -C $pure._state.repoDir fetch
  }
}