import * as actionTypes from "@nteract/actions" ; import { JSONObject } from "@nteract/commutable" ; import { HelpLink , KernelStatus , makeHelpLinkRecord , makeKernelInfoRecord , makeKernelNotStartedRecord , makeKernelsRecord , makeLocalKernelRecord , makeRemoteKernelRecord } from "@nteract/types" ; import { List , Map } from "immutable" ; import { Action , Reducer } from "redux" ; import { combineReducers } from "redux-immutable" ; const byRef = ( state = Map ( ) , action ) : Map < unknown , unknown > => { let typedAction ; switch ( action . type ) { case actionTypes . SET_LANGUAGE_INFO : return state ; case actionTypes . KILL_KERNEL_SUCCESSFUL : typedAction = action as actionTypes . KillKernelSuccessful ; return state . setIn ( [ typedAction . payload . kernelRef , "status" ] , KernelStatus . Killed ) ; case actionTypes . KILL_KERNEL_FAILED : typedAction = action as actionTypes . KillKernelFailed ; return state . setIn ( [ typedAction . payload . kernelRef , "status" ] , KernelStatus . Error ) ; case actionTypes . RESTART_KERNEL : typedAction = action as actionTypes . RestartKernel ; return state . setIn ( [ typedAction . payload . kernelRef , "status" ] , KernelStatus . Restarting ) ; case actionTypes . LAUNCH_KERNEL : typedAction = action as actionTypes . LaunchKernelAction ; return state . set ( typedAction . payload . kernelRef , makeKernelNotStartedRecord ( { status : KernelStatus . Starting , kernelSpecName : typedAction . payload . kernelSpec . name } ) ) ; case actionTypes . LAUNCH_KERNEL_BY_NAME : typedAction = action as actionTypes . LaunchKernelByNameAction ; return state . set ( typedAction . payload . kernelRef , makeKernelNotStartedRecord ( { status : KernelStatus . Starting , kernelSpecName : typedAction . payload . kernelSpecName } ) ) ; case actionTypes . CHANGE_KERNEL_BY_NAME : typedAction = action as actionTypes . ChangeKernelByName ; return state . setIn ( [ typedAction . payload . oldKernelRef , "status" ] , "changing" ) ; case actionTypes . SET_KERNEL_INFO : typedAction = action as actionTypes . SetKernelInfo ; let codemirrorMode = typedAction . payload . info . codemirrorMode ; if ( ! codemirrorMode ) { codemirrorMode = typedAction . payload . info . languageName ; } switch ( typeof codemirrorMode ) { case "string" : break ; case "object" : codemirrorMode = Map ( codemirrorMode as JSONObject ) ; break ; default : codemirrorMode = typedAction . payload . info . languageName ; } const helpLinks = typedAction . payload . info . helpLinks ? List ( ( typedAction . payload . info . helpLinks as HelpLink [ ] ) . map ( makeHelpLinkRecord ) ) : List ( ) ; return state . setIn ( [ typedAction . payload . kernelRef , "info" ] , makeKernelInfoRecord ( typedAction . payload . info ) . merge ( { helpLinks , codemirrorMode } ) ) ; case actionTypes . SET_EXECUTION_STATE : typedAction = action as actionTypes . SetExecutionStateAction ; return state . setIn ( [ typedAction . payload . kernelRef , "status" ] , typedAction . payload . kernelStatus ) ; case actionTypes . LAUNCH_KERNEL_SUCCESSFUL : typedAction = action as actionTypes . NewKernelAction ; switch ( typedAction . payload . kernel . type ) { case "zeromq" : return state . set ( typedAction . payload . kernelRef , makeLocalKernelRecord ( typedAction . payload . kernel ) ) ; case "websocket" : return state . set ( typedAction . payload . kernelRef , makeRemoteKernelRecord ( typedAction . payload . kernel ) ) ; default : throw new Error ( `Unrecognized kernel type in kernel ${ typedAction . payload . kernel }.` ) ; } case actionTypes . DISPOSE_KERNEL : { typedAction = action as actionTypes . DisposeKernel ; return state . delete ( typedAction . payload . kernelRef ) ; } default : return state ; } } ; export const kernels = combineReducers ( { byRef } , makeKernelsRecord as any ) ;