{-# LANGUAGE MultiParamTypeClasses #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Haskell.Debug.Adapter.State.DebugRun.Threads where

import Control.Monad.IO.Class
import qualified System.Log.Logger as L

import qualified Haskell.DAP as DAP
import Haskell.Debug.Adapter.Type
import Haskell.Debug.Adapter.Constant
import qualified Haskell.Debug.Adapter.Utility as U

-- |
--  Any errors should be sent back as False result Response
--
instance StateActivityIF DebugRunStateData DAP.ThreadsRequest where
  action _ (ThreadsRequest req) = do
    liftIO $ L.debugM _LOG_APP $ "DebugRunState ThreadsRequest called. " ++ show req
    app req

-- |
--
app :: DAP.ThreadsRequest -> AppContext (Maybe StateTransit)
app req = do
  resSeq <- U.getIncreasedResponseSequence
  let res = DAP.defaultThreadsResponse {
            DAP.seqThreadsResponse = resSeq
          , DAP.request_seqThreadsResponse = DAP.seqThreadsRequest req
          , DAP.successThreadsResponse = True
          }

  U.addResponse $ ThreadsResponse res

  return Nothing