glazier-react 0.3.0.2 → 0.4.0.0
raw patch · 6 files changed
+69/−30 lines, 6 filesdep ~disposabledep ~javascript-extrasPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: disposable, javascript-extras
API changes (from Hackage documentation)
- Glazier.React.Widget: type family PlanOf w :: *;
- Glazier.React.Widget: }
+ Glazier.React.Maker: [MkKey] :: (JSString -> nxt) -> Maker act nxt
+ Glazier.React.Maker: mkKey :: forall m_aq5c act_apP1. MonadFree (Maker act_apP1) m_aq5c => m_aq5c JSString
- Glazier.React.Maker: getComponent :: forall m_aq4C act_apOY. MonadFree (Maker act_apOY) m_aq4C => m_aq4C ReactComponent
+ Glazier.React.Maker: getComponent :: forall m_aq59 act_apP1. MonadFree (Maker act_apP1) m_aq59 => m_aq59 ReactComponent
- Glazier.React.Maker: mkEmptyFrame :: forall (mdl_XpPe :: Type) (pln_XpPg :: Type) m_aq4q act_apOY. MonadFree (Maker act_apOY) m_aq4q => m_aq4q (Frame mdl_XpPe pln_XpPg)
+ Glazier.React.Maker: mkEmptyFrame :: forall (mdl_XpPh :: Type) (pln_XpPj :: Type) m_aq4X act_apP1. MonadFree (Maker act_apP1) m_aq4X => m_aq4X (Frame mdl_XpPh pln_XpPj)
- Glazier.React.Maker: mkHandler :: forall m_aq4m act_apOY. MonadFree (Maker act_apOY) m_aq4m => (JSVal -> MaybeT IO [act_apOY]) -> m_aq4m (Callback (JSVal -> IO ()))
+ Glazier.React.Maker: mkHandler :: forall m_aq4T act_apP1. MonadFree (Maker act_apP1) m_aq4T => (JSVal -> MaybeT IO [act_apP1]) -> m_aq4T (Callback (JSVal -> IO ()))
- Glazier.React.Maker: mkRenderer :: forall (mdl_XpPi :: Type) (pln_XpPk :: Type) m_aq4t act_apOY. MonadFree (Maker act_apOY) m_aq4t => Frame mdl_XpPi pln_XpPk -> (JSVal -> WindowT (Design mdl_XpPi pln_XpPk) ReactMl ()) -> m_aq4t (Callback (JSVal -> IO JSVal))
+ Glazier.React.Maker: mkRenderer :: forall (mdl_XpPl :: Type) (pln_XpPn :: Type) m_aq50 act_apP1. MonadFree (Maker act_apP1) m_aq50 => Frame mdl_XpPl pln_XpPn -> (JSVal -> WindowT (Design mdl_XpPl pln_XpPn) ReactMl ()) -> m_aq50 (Callback (JSVal -> IO JSVal))
- Glazier.React.Maker: putFrame :: forall (mdl_XpPm :: Type) (pln_XpPo :: Type) m_aq4y act_apOY. MonadFree (Maker act_apOY) m_aq4y => Frame mdl_XpPm pln_XpPo -> Design mdl_XpPm pln_XpPo -> m_aq4y ()
+ Glazier.React.Maker: putFrame :: forall (mdl_XpPp :: Type) (pln_XpPr :: Type) m_aq55 act_apP1. MonadFree (Maker act_apP1) m_aq55 => Frame mdl_XpPp pln_XpPr -> Design mdl_XpPp pln_XpPr -> m_aq55 ()
- Glazier.React.Maker.Run: run :: ReactComponent -> Output act -> Maker act (IO a) -> IO a
+ Glazier.React.Maker.Run: run :: MVar Int -> ReactComponent -> Output act -> Maker act (IO a) -> IO a
- Glazier.React.Widget: class (Disposing (ModelOf w), Disposing (PlanOf w)) => IsWidget w where type CommandOf w :: * type ActionOf w :: * type ModelOf w :: * type PlanOf w :: * where {
+ Glazier.React.Widget: class (Disposing (ModelOf w), Disposing (PlanOf w)) => IsWidget w
Files
- glazier-react.cabal +3/−3
- src/Glazier/React/Command.hs +1/−1
- src/Glazier/React/Maker.hs +5/−0
- src/Glazier/React/Maker/Run.hs +14/−6
- src/Glazier/React/Model.hs +2/−1
- src/Glazier/React/Widget.hs +44/−19
glazier-react.cabal view
@@ -1,5 +1,5 @@ name: glazier-react-version: 0.3.0.2+version: 0.4.0.0 synopsis: ReactJS binding using Glazier and Pipes.Fluid description: ReactJS binding using Glazier and Pipes.Fluid, which is more functional and composable than Elm/Flux.@@ -32,11 +32,11 @@ build-depends: base >= 4.7 && < 5 , containers >= 0.5 && < 0.6 , deepseq >= 1.4 && < 1.5- , disposable >= 0.2.0.2 && < 1+ , disposable >= 0.2.0.3 && < 1 , dlist >= 0.8 && < 0.9 , free >= 4.12 && < 5 , glazier >= 0.10 && < 1- , javascript-extras >= 0.2 && < 1+ , javascript-extras >= 0.2.0.2 && < 1 , lens >= 4 && < 5 , mmorph >= 1 && < 2 , mtl >= 2 && < 3
src/Glazier/React/Command.hs view
@@ -20,7 +20,7 @@ -> (sm -> [JE.Property] -> J.JSVal -> cmd) -> m cmd basicRenderCmd frameNum componentRef fcmd = do- frameNum %= (\i -> (i `mod` maxBound) + 1)+ frameNum %= (\i -> (i `mod` JE.maxSafeInteger) + 1) i <- JE.toJS <$> use frameNum r <- use componentRef sm <- get
src/Glazier/React/Maker.hs view
@@ -41,6 +41,9 @@ GetComponent :: (R.ReactComponent -> nxt) -> Maker act nxt+ MkKey+ :: (J.JSString -> nxt)+ -> Maker act nxt instance Functor (Maker act) where fmap f (MkHandler handler g) = MkHandler handler (f . g)@@ -48,6 +51,7 @@ fmap f (MkRenderer ms render g) = MkRenderer ms render (f . g) fmap f (PutFrame frm dsn x) = PutFrame frm dsn (f x) fmap f (GetComponent g) = GetComponent (f . g)+ fmap f (MkKey g) = MkKey (f . g) makeFree ''Maker @@ -58,3 +62,4 @@ mapAction _ (MkRenderer ms render g) = MkRenderer ms render g mapAction _ (PutFrame frm dsn x) = PutFrame frm dsn x mapAction _ (GetComponent g) = GetComponent g+mapAction _ (MkKey g) = MkKey g
src/Glazier/React/Maker/Run.hs view
@@ -6,6 +6,7 @@ import Control.Monad.Morph import Control.Monad.Trans.Maybe import Data.Foldable+import qualified Data.JSString as JS import qualified GHCJS.Foreign.Callback as J import qualified GHCJS.Types as J import qualified Glazier as G@@ -32,15 +33,22 @@ acts <- handler evt traverse_ (\act -> lift $ atomically $ PC.send output act >>= guard) acts -run :: R.ReactComponent -> PC.Output act -> R.Maker act (IO a) -> IO a-run _ output (R.MkHandler handler g) = mkActionCallback output handler >>= g+run :: MVar Int -> R.ReactComponent -> PC.Output act -> R.Maker act (IO a) -> IO a+run _ _ output (R.MkHandler handler g) = mkActionCallback output handler >>= g -run _ _ (R.MkEmptyFrame g) = newEmptyMVar >>= g+run _ _ _ (R.MkEmptyFrame g) = newEmptyMVar >>= g -run _ _ (R.MkRenderer ms render g) = J.syncCallback1' (onRender ms render') >>= g+run _ _ _ (R.MkRenderer ms render g) = J.syncCallback1' (onRender ms render') >>= g where render' v = hoist (hoist generalize) (render v) -run _ _ (R.PutFrame frm dsn g) = putMVar frm dsn >> g+run _ _ _ (R.PutFrame frm dsn g) = putMVar frm dsn >> g -run component _ (R.GetComponent g) = g component+run _ component _ (R.GetComponent g) = g component++run muid _ _ (R.MkKey g) = do+ -- expects that muid is not empty!+ uid <- readMVar muid+ let uid' = (uid `mod` JE.maxSafeInteger) + 1+ void $ swapMVar muid uid'+ g (JS.pack . show $ uid')
src/Glazier/React/Model.hs view
@@ -59,7 +59,8 @@ , _frame :: Frame mdl pln } deriving (G.Generic) --- Undecidableinstances!+-- | Undecidableinstances!+-- But this is safe because Design is definitely smaller than SuperModel instance CD.Disposing (Design mdl pln) => CD.Disposing (SuperModel mdl pln) where disposing s = CD.disposing $ s ^. design
src/Glazier/React/Widget.hs view
@@ -1,6 +1,5 @@-{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-}@@ -16,42 +15,68 @@ import qualified Glazier.React.Markup as R import qualified Glazier.React.Model as R -class (CD.Disposing (ModelOf w)- , CD.Disposing (PlanOf w)) => IsWidget w where- -- | The pure model for state and rendering- type CommandOf w :: *- type ActionOf w :: *- type ModelOf w :: *- type PlanOf w :: *- mkPlan :: w -> R.Frame (ModelOf w) (PlanOf w) -> F (R.Maker (ActionOf w)) (PlanOf w)- window :: w -> G.WindowT (R.Design (ModelOf w) (PlanOf w)) (R.ReactMlT Identity) ()- gadget :: w -> G.GadgetT (ActionOf w) (R.SuperModel (ModelOf w) (PlanOf w)) Identity (D.DList (CommandOf w))+type family CommandOf w where+ CommandOf (Widget c a m p) = c +type family ActionOf w where+ ActionOf (Widget c a m p) = a++type family ModelOf w where+ ModelOf (Widget c a m p) = m++type family PlanOf w where+ PlanOf (Widget c a m p) = p++-- | Undecidable instances! But this is safe because 'ModelOf w' and 'PlanOf w'+-- is guaranteed to be smaller than closed type family 'DesignOf w'. type family DesignOf w where DesignOf w = R.Design (ModelOf w) (PlanOf w) +-- | Undecidable instances! But this is safe because 'ModelOf w' and 'PlanOf w'+-- is guaranteed to be smaller than closed type family 'FrameOf w'. type family FrameOf w where FrameOf w = R.Frame (ModelOf w) (PlanOf w) +-- | Undecidable instances! But this is safe because 'ModelOf w' and 'PlanOf w'+-- is guaranteed to be smaller than closed type family 'SuperModelOf w'. type family SuperModelOf w where SuperModelOf w = R.SuperModel (ModelOf w) (PlanOf w) --- | Contains everything you need to make the model,+-- | Record of functions for a widget. Contains everything you need to make the model, -- render, and run the event processing. data Widget c a m p = Widget (R.Frame m p -> F (R.Maker a) p) (G.WindowT (R.Design m p) (R.ReactMlT Identity) ()) (G.GadgetT a (R.SuperModel m p) Identity (D.DList c)) -instance (CD.Disposing m, CD.Disposing p) =>- IsWidget (Widget c a m p) where- type CommandOf (Widget c a m p) = c- type ActionOf (Widget c a m p) = a- type ModelOf (Widget c a m p) = m- type PlanOf (Widget c a m p) = p+-- | This typeclass is convenient as it carries the 'Disposing Model' and 'Disposing Plan' constraints+-- and allows treating 'Widget c a m p' as a type 'w'+class (CD.Disposing (ModelOf w)+ , CD.Disposing (PlanOf w)) => IsWidget w where+ mkPlan :: w -> R.Frame (ModelOf w) (PlanOf w) -> F (R.Maker (ActionOf w)) (PlanOf w)+ window :: w -> G.WindowT (R.Design (ModelOf w) (PlanOf w)) (R.ReactMlT Identity) ()+ gadget :: w -> G.GadgetT (ActionOf w) (R.SuperModel (ModelOf w) (PlanOf w)) Identity (D.DList (CommandOf w))++instance (CD.Disposing m, CD.Disposing p) => IsWidget (Widget c a m p) where mkPlan (Widget f _ _) = f window (Widget _ f _) = f gadget (Widget _ _ f) = f++-- data Widget c a m p where+-- Widget :: (CD.Disposing m, CD.Disposing p) =>+-- (R.Frame m p -> F (R.Maker a) p)+-- -> G.WindowT (R.Design m p) (R.ReactMlT Identity) ()+-- -> G.GadgetT a (R.SuperModel m p) Identity (D.DList c)+-- -> Widget c a m p++-- mkPlan :: Widget c a m p -> R.Frame m p -> F (R.Maker a) p+-- mkPlan (Widget f _ _) = f++-- window :: Widget c a m p -> G.WindowT (R.Design m p) (R.ReactMlT Identity) ()+-- window (Widget _ f _) = f++-- gadget :: Widget c a m p -> G.GadgetT a (R.SuperModel m p) Identity (D.DList c)+-- gadget (Widget _ _ f) = f mkSuperModel :: IsWidget w => w -> ModelOf w -> F (R.Maker (ActionOf w)) (R.SuperModel (ModelOf w) (PlanOf w)) mkSuperModel w mdl = do