content: {-# LANGUAGE NamedFieldPuns #-}
  {-# LANGUAGE RecordWildCards #-}
  
  module LiveCoding.Migrate.Debugger where
  
  -- base
  import Data.Data
  
  -- essence-of-live-coding
  import LiveCoding.Debugger
  import LiveCoding.Migrate.Migration
  
  maybeMigrateToDebugging ::
    (Typeable state', Typeable state) =>
    Debugging dbgState state ->
    state' ->
    Maybe (Debugging dbgState state)
  maybeMigrateToDebugging Debugging {dbgState} state' = do
    state <- cast state'
    return Debugging {..}
  
  -- | Tries to cast the current state into the joint state of debugger and program.
  migrationToDebugging :: Migration
  migrationToDebugging = migrationTo2 maybeMigrateToDebugging
  
  maybeMigrateFromDebugging ::
    (Typeable state', Typeable state) =>
    Debugging dbgState state ->
    Maybe state'
  maybeMigrateFromDebugging Debugging {state} = cast state
  
  -- | Try to extract a state from the current joint state of debugger and program.
  migrationFromDebugging :: Migration
  migrationFromDebugging = constMigrationFrom2 maybeMigrateFromDebugging
  
  -- | Combines 'migrationToDebugging' and 'migrationFromDebugging'.
  migrationDebugging :: Migration
  migrationDebugging = migrationToDebugging <> migrationFromDebugging
  