module React.Local (locally, Narrowing(..)) where
import Control.Applicative
import Data.Void
import React.Types
data Narrowing general local = Narrowing
{ localizeAnimationState :: AnimationState general -> AnimationState local
, generalizeSignal :: Signal local -> Signal general
}
locally :: Monad m
=> Narrowing general local
-> ReactT local m x
-> ReactT general m x
locally narrowing nested = ReactT $ \anim -> do
(nodes, x) <- runReactT nested (localizeAnimationState narrowing anim)
return (map (nodeConvert (generalizeSignal narrowing)) nodes, x)
handlerConvert :: (localSig -> generalSig)
-> EventHandler localSig
-> EventHandler generalSig
handlerConvert generalize (EventHandler handle ty) =
EventHandler (\raw -> generalize <$> handle raw) ty
nodeConvert :: (localSig -> generalSig)
-> ReactNode localSig
-> ReactNode generalSig
nodeConvert generalize (Parent name attrs handlers children) =
Parent name attrs (map (handlerConvert generalize) handlers)
(map (nodeConvert generalize) children)
nodeConvert generalize (Leaf name attrs handlers) =
Leaf name attrs (map (handlerConvert generalize) handlers)
nodeConvert _ (Text str) = Text str