module Dingo.Internal.Session
( SessionT
, SessionState
, addWidget
, getWidgetStateM
, lookupResource
, newWidgetId
, registerCallback
, registerResourceBundle
, registerWidgetType
, runCallback
, runSessionT
, setWidgetStateM
) where
import Data.Aeson (Value)
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as H
import Data.Label.PureM (modify)
import Data.Monoid (Monoid(..))
import Dingo.Internal.Base
import Dingo.Internal.CallbackTypes
import Dingo.Internal.SessionTypes
import Dingo.Internal.WidgetSet
runCallback :: CallbackId -> HashMap WidgetId Value -> SessionT WrapCallback IO CallbackState
runCallback callbackId encodedStatesFromBrowser = SessionT $ do
modify widgetSet
(\cs -> H.foldrWithKey setWidgetStateJ cs encodedStatesFromBrowser)
mcallback <- unSession $ lookupCallback callbackId
case mcallback of
Nothing ->
return mempty
Just callback ->
fmap snd $ unSession $ runCallbackT $ unWrapCallback callback