packages feed

glazier 0.9.0.0 → 0.10.0.0

raw patch · 4 files changed

+84/−97 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Glazier.Widget: instance (GHC.Base.Monad m, GHC.Base.Monad n) => Glazier.Class.Implant (Glazier.Widget.Widget v m r a s n c) (Glazier.Widget.Widget v m r a t n c) s t
- Glazier.Widget: instance (GHC.Base.Monad m, GHC.Base.Monad n, Data.Semigroup.Semigroup r, Data.Semigroup.Semigroup c) => Data.Semigroup.Semigroup (Glazier.Widget.Widget v m r a s n c)
- Glazier.Widget: instance (GHC.Base.Monad m, GHC.Base.Monad n, GHC.Base.Monoid r) => GHC.Base.Applicative (Glazier.Widget.Widget v m r a s n)
- Glazier.Widget: instance (GHC.Base.Monad m, GHC.Base.Monad n, GHC.Base.Monoid r, GHC.Base.Monoid c) => GHC.Base.Monoid (Glazier.Widget.Widget v m r a s n c)
- Glazier.Widget: instance GHC.Base.Functor n => GHC.Base.Functor (Glazier.Widget.Widget v m r a s n)
- Glazier.Widget: instance GHC.Base.Monad n => Glazier.Class.Dispatch (Glazier.Widget.Widget v m r a s n c) (Glazier.Widget.Widget v m r b s n c) a b
- Glazier.Window: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup r) => Data.Semigroup.Semigroup (Glazier.Window.WindowT s v m r)
- Glazier.Window: instance (GHC.Base.Monad m, GHC.Base.Monoid r) => GHC.Base.Monoid (Glazier.Window.WindowT s v m r)
- Glazier.Window: instance Control.Lens.Wrapped.Wrapped (Glazier.Window.WindowT s0 v0 m0 r0)
- Glazier.Window: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Window.WindowT s v m)
- Glazier.Window: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Window.WindowT s v m)
- Glazier.Window: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Window.WindowT s v m)
- Glazier.Window: instance Control.Monad.Morph.MFunctor (Glazier.Window.WindowT s v)
- Glazier.Window: instance Control.Monad.Trans.Class.MonadTrans (Glazier.Window.WindowT s v)
- Glazier.Window: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Window.WindowT s v m)
- Glazier.Window: instance GHC.Base.Monad m => Control.Lens.Zoom.Magnify (Glazier.Window.WindowT s v m) (Glazier.Window.WindowT t v m) s t
- Glazier.Window: instance GHC.Base.Monad m => Control.Lens.Zoom.Zoom (Glazier.Window.WindowT s v m) (Glazier.Window.WindowT s u m) v u
- Glazier.Window: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader s (Glazier.Window.WindowT s v m)
- Glazier.Window: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState v (Glazier.Window.WindowT s v m)
- Glazier.Window: instance GHC.Base.Monad m => GHC.Base.Applicative (Glazier.Window.WindowT s v m)
- Glazier.Window: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Window.WindowT s v m)
- Glazier.Window: instance GHC.Base.Monad m => Glazier.Class.Implant (Glazier.Window.WindowT s v m r) (Glazier.Window.WindowT t v m r) s t
- Glazier.Window: instance GHC.Base.MonadPlus m => GHC.Base.Alternative (Glazier.Window.WindowT s v m)
- Glazier.Window: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Window.WindowT s v m)
- Glazier.Window: instance Glazier.Window.WindowT s0 v0 m0 r0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Window.WindowT s1 v1 m1 r1) t0
+ Glazier.Widget: instance (GHC.Base.Applicative m, GHC.Base.Monad n, Data.Semigroup.Semigroup v, Data.Semigroup.Semigroup c) => Data.Semigroup.Semigroup (Glazier.Widget.Widget m v a s n c)
+ Glazier.Widget: instance (GHC.Base.Applicative m, GHC.Base.Monad n, GHC.Base.Monoid v) => GHC.Base.Applicative (Glazier.Widget.Widget m v a s n)
+ Glazier.Widget: instance (GHC.Base.Applicative m, GHC.Base.Monad n, GHC.Base.Monoid v, GHC.Base.Monoid c) => GHC.Base.Monoid (Glazier.Widget.Widget m v a s n c)
+ Glazier.Widget: instance (GHC.Base.Monad m, GHC.Base.Monad n) => Glazier.Class.Implant (Glazier.Widget.Widget m v a s n c) (Glazier.Widget.Widget m v a t n c) s t
+ Glazier.Widget: instance GHC.Base.Functor n => GHC.Base.Functor (Glazier.Widget.Widget m v a s n)
+ Glazier.Widget: instance GHC.Base.Monad n => Glazier.Class.Dispatch (Glazier.Widget.Widget m v a s n c) (Glazier.Widget.Widget m v b s n c) a b
+ Glazier.Window: instance (GHC.Base.Applicative m, Data.Semigroup.Semigroup v) => Data.Semigroup.Semigroup (Glazier.Window.WindowT s m v)
+ Glazier.Window: instance (GHC.Base.Applicative m, GHC.Base.Monoid v) => GHC.Base.Monoid (Glazier.Window.WindowT s m v)
+ Glazier.Window: instance Control.Lens.Wrapped.Wrapped (Glazier.Window.WindowT s0 m0 v0)
+ Glazier.Window: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Window.WindowT s m)
+ Glazier.Window: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Window.WindowT s m)
+ Glazier.Window: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Window.WindowT s m)
+ Glazier.Window: instance Control.Monad.Morph.MFunctor (Glazier.Window.WindowT s)
+ Glazier.Window: instance Control.Monad.Trans.Class.MonadTrans (Glazier.Window.WindowT s)
+ Glazier.Window: instance GHC.Base.Alternative m => GHC.Base.Alternative (Glazier.Window.WindowT s m)
+ Glazier.Window: instance GHC.Base.Applicative m => GHC.Base.Applicative (Glazier.Window.WindowT s m)
+ Glazier.Window: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Window.WindowT s m)
+ Glazier.Window: instance GHC.Base.Monad m => Control.Lens.Zoom.Magnify (Glazier.Window.WindowT s m) (Glazier.Window.WindowT t m) s t
+ Glazier.Window: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader s (Glazier.Window.WindowT s m)
+ Glazier.Window: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Window.WindowT s m)
+ Glazier.Window: instance GHC.Base.Monad m => Glazier.Class.Implant (Glazier.Window.WindowT s m v) (Glazier.Window.WindowT t m v) s t
+ Glazier.Window: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Window.WindowT s m)
+ Glazier.Window: instance Glazier.Window.WindowT s0 m0 v0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Window.WindowT s1 m1 v1) t0
- Glazier.Example: indexedExample :: (Monoid r, Monoid c, Monoid (t r), Field2 b b a a, Field1 b b (Index (t s)) (Index (t s)), Ixed (t s), Semigroup r, Semigroup c, Semigroup (t r), AsAction b (t s -> t s), IxValue (t s) ~ s, Monad m, Traversable t) => Widget v m r a s m c -> Widget v m (t r) b (t s) m c
+ Glazier.Example: indexedExample :: (Monoid v, Monoid c, Field2 b b a a, Field1 b b (Index (t s)) (Index (t s)), Ixed (t s), Semigroup v, Semigroup c, AsAction b (t s -> t s), IxValue (t s) ~ s, Monad m, Traversable t) => Widget m v a s m c -> Widget m v b (t s) m c
- Glazier.Example: listExample :: (Monoid r, Monoid c, Semigroup r, Semigroup c, AsTail a, AsConsAction a s, AsAction a ([s] -> [s]), Monad m) => Prism' b a -> Widget v m r a s m c -> Widget v m [r] b [s] m c
+ Glazier.Example: listExample :: (Monoid v, Monoid c, Semigroup v, Semigroup c, AsTail a, AsConsAction a s, AsAction a ([s] -> [s]), Monad m) => Prism' b a -> Widget m v a s m c -> Widget m v b [s] m c
- Glazier.Example: optionalExample :: (Monoid c, Monoid r, Semigroup c, Semigroup r, AsSet a s, AsReset a, AsAction a (Maybe s -> Maybe s), Monad m) => Prism' a a' -> Widget v m r a' s m c -> Widget v m r a (Maybe s) m c
+ Glazier.Example: optionalExample :: (Monoid c, Monoid v, Semigroup c, Semigroup v, AsSet a s, AsReset a, AsAction a (Maybe s -> Maybe s), Monad m) => Prism' a a' -> Widget m v a' s m c -> Widget m v a (Maybe s) m c
- Glazier.Widget: Widget :: WindowT s v m r -> GadgetT a s n c -> Widget v m r a s n c
+ Glazier.Widget: Widget :: WindowT s m v -> GadgetT a s n c -> Widget m v a s n c
- Glazier.Widget: [gadget] :: Widget v m r a s n c -> GadgetT a s n c
+ Glazier.Widget: [gadget] :: Widget m v a s n c -> GadgetT a s n c
- Glazier.Widget: [window] :: Widget v m r a s n c -> WindowT s v m r
+ Glazier.Widget: [window] :: Widget m v a s n c -> WindowT s m v
- Glazier.Widget: _Widget :: Iso (Widget v m r a s n c) (Widget v' m' r' a' s' n' c') (s -> v -> m (r, v), a -> s -> n (c, s)) (s' -> v' -> m' (r', v'), a' -> s' -> n' (c', s'))
+ Glazier.Widget: _Widget :: Iso (Widget m v a s n c) (Widget m' v' a' s' n' c') (s -> m v, a -> s -> n (c, s)) (s' -> m' v', a' -> s' -> n' (c', s'))
- Glazier.Widget: _Widget' :: Iso' (Widget v m r a s n c) (s -> v -> m (r, v), a -> s -> n (c, s))
+ Glazier.Widget: _Widget' :: Iso' (Widget m v a s n c) (s -> m v, a -> s -> n (c, s))
- Glazier.Widget: _WrappingWidget :: Iso (Widget v m r a s n c) (Widget v' m' r' a' s' n' c') (WindowT s v m r, GadgetT a s n c) (WindowT s' v' m' r', GadgetT a' s' n' c')
+ Glazier.Widget: _WrappingWidget :: Iso (Widget m v a s n c) (Widget m' v' a' s' n' c') (WindowT s m v, GadgetT a s n c) (WindowT s' m' v', GadgetT a' s' n' c')
- Glazier.Widget: _WrappingWidget' :: Iso' (Widget v m r a s n c) (WindowT s v m r, GadgetT a s n c)
+ Glazier.Widget: _WrappingWidget' :: Iso' (Widget m v a s n c) (WindowT s m v, GadgetT a s n c)
- Glazier.Widget: _gadget :: Lens (Widget v m r a s n c) (Widget v m r a' s n' c') (GadgetT a s n c) (GadgetT a' s n' c')
+ Glazier.Widget: _gadget :: Lens (Widget m v a s n c) (Widget m v a' s n' c') (GadgetT a s n c) (GadgetT a' s n' c')
- Glazier.Widget: _gadget' :: Lens' (Widget v m r a s n c) (GadgetT a s n c)
+ Glazier.Widget: _gadget' :: Lens' (Widget m v a s n c) (GadgetT a s n c)
- Glazier.Widget: _window :: Lens (Widget v m r a s n c) (Widget v' m' r' a s n c) (WindowT s v m r) (WindowT s v' m' r')
+ Glazier.Widget: _window :: Lens (Widget m v a s n c) (Widget m' v' a s n c) (WindowT s m v) (WindowT s m' v')
- Glazier.Widget: _window' :: Lens' (Widget v m r a s n c) (WindowT s v m r)
+ Glazier.Widget: _window' :: Lens' (Widget m v a s n c) (WindowT s m v)
- Glazier.Widget: aboveWidget :: (Widget v m r a s n c -> Widget v' m' r' a' s' n' c') -> (s -> v -> m (r, v), a -> s -> n (c, s)) -> (s' -> v' -> m' (r', v'), a' -> s' -> n' (c', s'))
+ Glazier.Widget: aboveWidget :: (Widget m v a s n c -> Widget m' v' a' s' n' c') -> (s -> m v, a -> s -> n (c, s)) -> (s' -> m' v', a' -> s' -> n' (c', s'))
- Glazier.Widget: belowWidget :: ((s -> v -> m (r, v), a -> s -> n (c, s)) -> (s' -> v' -> m' (r', v'), a' -> s' -> n' (c', s'))) -> Widget v m r a s n c -> Widget v' m' r' a' s' n' c'
+ Glazier.Widget: belowWidget :: ((s -> m v, a -> s -> n (c, s)) -> (s' -> m' v', a' -> s' -> n' (c', s'))) -> Widget m v a s n c -> Widget m' v' a' s' n' c'
- Glazier.Widget: data Widget v m r a s n c
+ Glazier.Widget: data Widget m v a s n c
- Glazier.Widget: dynamically :: (Monad m, Monoid r) => GadgetT a s n c -> Widget v m r a s n c
+ Glazier.Widget: dynamically :: (Applicative m, Monoid v) => GadgetT a s n c -> Widget m v a s n c
- Glazier.Widget: mkWidget :: (WindowT s v m r, GadgetT a s n c) -> Widget v m r a s n c
+ Glazier.Widget: mkWidget :: (WindowT s m v, GadgetT a s n c) -> Widget m v a s n c
- Glazier.Widget: mkWidget' :: (s -> v -> m (r, v), a -> s -> n (c, s)) -> Widget v m r a s n c
+ Glazier.Widget: mkWidget' :: (s -> m v, a -> s -> n (c, s)) -> Widget m v a s n c
- Glazier.Widget: overWidget :: (Widget v m r a s n c -> Widget v' m' r' a' s' n' c') -> (WindowT s v m r, GadgetT a s n c) -> (WindowT s' v' m' r', GadgetT a' s' n' c')
+ Glazier.Widget: overWidget :: (Widget m v a s n c -> Widget m' v' a' s' n' c') -> (WindowT s m v, GadgetT a s n c) -> (WindowT s' m' v', GadgetT a' s' n' c')
- Glazier.Widget: runWidget :: Widget v m r a s n c -> (WindowT s v m r, GadgetT a s n c)
+ Glazier.Widget: runWidget :: Widget m v a s n c -> (WindowT s m v, GadgetT a s n c)
- Glazier.Widget: runWidget' :: Widget v m r a s n c -> (s -> v -> m (r, v), a -> s -> n (c, s))
+ Glazier.Widget: runWidget' :: Widget m v a s n c -> (s -> m v, a -> s -> n (c, s))
- Glazier.Widget: statically :: (Monad n, Monoid c) => WindowT s v m r -> Widget v m r a s n c
+ Glazier.Widget: statically :: (Monad n, Monoid c) => WindowT s m v -> Widget m v a s n c
- Glazier.Widget: underWidget :: ((WindowT s v m r, GadgetT a s n c) -> (WindowT s' v' m' r', GadgetT a' s' n' c')) -> Widget v m r a s n c -> Widget v' m' r' a' s' n' c'
+ Glazier.Widget: underWidget :: ((WindowT s m v, GadgetT a s n c) -> (WindowT s' m' v', GadgetT a' s' n' c')) -> Widget m v a s n c -> Widget m' v' a' s' n' c'
- Glazier.Window: WindowT :: ReaderT s (StateT v m) r -> WindowT s v m r
+ Glazier.Window: WindowT :: ReaderT s m v -> WindowT s m v
- Glazier.Window: [runWindowT] :: WindowT s v m r -> ReaderT s (StateT v m) r
+ Glazier.Window: [runWindowT] :: WindowT s m v -> ReaderT s m v
- Glazier.Window: _WindowT :: Iso (WindowT s v m r) (WindowT s' v' m' r') (s -> v -> m (r, v)) (s' -> v' -> m' (r', v'))
+ Glazier.Window: _WindowT :: Iso (WindowT s m v) (WindowT s' m' v') (s -> m v) (s' -> m' v')
- Glazier.Window: _WindowT' :: Iso' (WindowT s v m r) (s -> v -> m (r, v))
+ Glazier.Window: _WindowT' :: Iso' (WindowT s m v) (s -> m v)
- Glazier.Window: aboveWindowT :: (WindowT s v m r -> WindowT s' v' m' r') -> (s -> v -> m (r, v)) -> s' -> v' -> m' (r', v')
+ Glazier.Window: aboveWindowT :: (WindowT s m v -> WindowT s' m' v') -> (s -> m v) -> (s' -> m' v')
- Glazier.Window: belowWindowT :: ((s -> v -> m (r, v)) -> s' -> v' -> m' (r', v')) -> WindowT s v m r -> WindowT s' v' m' r'
+ Glazier.Window: belowWindowT :: ((s -> m v) -> (s' -> m' v')) -> WindowT s m v -> WindowT s' m' v'
- Glazier.Window: mkWindowT' :: (s -> v -> m (r, v)) -> WindowT s v m r
+ Glazier.Window: mkWindowT' :: (s -> m v) -> WindowT s m v
- Glazier.Window: newtype WindowT s v m r
+ Glazier.Window: newtype WindowT s m v
- Glazier.Window: overWindowT :: (WindowT s v m r -> WindowT s' v' m' r') -> ReaderT s (StateT v m) r -> ReaderT s' (StateT v' m') r'
+ Glazier.Window: overWindowT :: (WindowT s m v -> WindowT s' m' v') -> ReaderT s m v -> ReaderT s' m' v'
- Glazier.Window: runWindowT' :: WindowT s v m r -> (s -> v -> m (r, v))
+ Glazier.Window: runWindowT' :: WindowT s m v -> (s -> m v)
- Glazier.Window: type Window s v = WindowT s v Identity
+ Glazier.Window: type Window s = WindowT s Identity
- Glazier.Window: underWindowT :: (ReaderT s (StateT v m) r -> ReaderT s' (StateT v' m') r') -> WindowT s v m r -> WindowT s' v' m' r'
+ Glazier.Window: underWindowT :: (ReaderT s m v -> ReaderT s' m' v') -> WindowT s m v -> WindowT s' m' v'

Files

glazier.cabal view
@@ -1,5 +1,5 @@ name:                glazier-version:             0.9.0.0+version:             0.10.0.0 synopsis:            Composable widgets framework description:         Please see README.md homepage:            https://github.com/louispan/glazier#readme
src/Glazier/Example.hs view
@@ -13,6 +13,7 @@ import Control.Category import Control.Lens import Control.Monad.Reader+import Data.Foldable import Data.List import Data.Semigroup import Glazier@@ -62,15 +63,15 @@ -- Widget s v m a c optionalExample ::   ( Monoid c-  , Monoid r+  , Monoid v   , Semigroup c-  , Semigroup r+  , Semigroup v   , AsSet a s   , AsReset a   , AsAction a (Maybe s -> Maybe s)   , Monad m   )-  => Prism' a a' -> Widget v m r a' s m c -> Widget v m r a (Maybe s) m c+  => Prism' a a' -> Widget m v a' s m c -> Widget m v a (Maybe s) m c optionalExample p w =      (      implant _Just -- original update will only work if model is Just@@ -95,22 +96,22 @@ -- modify the state of the head. -- The view will be mempty if Nil. listExample ::-  ( Monoid r+  ( Monoid v   , Monoid c-  , Semigroup r+  , Semigroup v   , Semigroup c   , AsTail a   , AsConsAction a s   , AsAction a ([s] -> [s])   , Monad m   )-  => Prism' b a -> Widget v m r a s m c -> Widget v m [r] b [s] m c+  => Prism' b a -> Widget m v a s m c -> Widget m v b [s] m c listExample p (Widget (WindowT d) g) =      -- Create a list rendering function by      -- sequencing the View from the original widget.      statically (WindowT . ReaderT $ \ss -> do-                        let ms = runReaderT d <$> ss -- [(StateT s m) a]-                        sequenceA ms)+                        ss' <- traverse (runReaderT d) ss+                        pure (fold ss'))   <> dynamically     (  implant (ix 0) g -- original update will only work on the head of list     <> dispatch _Tail       (review _GadgetT $ \_ s -> pure (mempty, tail s))@@ -127,26 +128,24 @@ -- * A tuple of (key, original action) -- The original action is now a tuple with an additional key, which will act on the widget if the key exists in the map. indexedExample ::-  ( Monoid r+  ( Monoid v   , Monoid c-  , Monoid (t r)   , Field2 b b a a   , Field1 b b (Index (t s)) (Index (t s))   , Ixed (t s)-  , Semigroup r+  , Semigroup v   , Semigroup c-  , Semigroup (t r)   , AsAction b (t s -> t s)   , IxValue (t s) ~ s   , Monad m   , Traversable t   )-  => Widget v m r a s m c -> Widget v m (t r) b (t s) m c+  => Widget m v a s m c -> Widget m v b (t s) m c indexedExample (Widget (WindowT d) g) =      -- Create a rendering function by folding the original view function      statically (WindowT . ReaderT $ \ss -> do-                        let ms = runReaderT d <$> ss -- [(StateT s m) a]-                        sequenceA ms)+                        ss' <- traverse (runReaderT d) ss+                        pure (fold ss'))   <>     dynamically     (
src/Glazier/Widget.hs view
@@ -34,104 +34,104 @@ import Glazier.Window  -- | A widget is basically a tuple with Gadget and Window, but with handy instances for implant and dispatch.-data Widget v m r a s n c = Widget-  { window :: WindowT s v m r+data Widget m v a s n c = Widget+  { window :: WindowT s m v   , gadget :: GadgetT a s n c   }  -- | polymorphic lens to the window of a widget-_window :: Lens (Widget v m r a s n c) (Widget v' m' r' a s n c) (WindowT s v m r) (WindowT s v' m' r')+_window :: Lens (Widget m v a s n c) (Widget m' v' a s n c) (WindowT s m v) (WindowT s m' v') _window = lens window (\(Widget _ g) w -> Widget w g) {-# INLINABLE _window #-}  -- | polymorphic lens to the gadget of a widget-_gadget :: Lens (Widget v m r a s n c) (Widget v m r a' s n' c') (GadgetT a s n c) (GadgetT a' s n' c')+_gadget :: Lens (Widget m v a s n c) (Widget m v a' s n' c') (GadgetT a s n c) (GadgetT a' s n' c') _gadget = lens gadget (\(Widget w _) g -> Widget w g) {-# INLINABLE _gadget #-}  -- | non polymorphic lens to the window of a widget-_window' :: Lens' (Widget v m r a s n c) (WindowT s v m r)+_window' :: Lens' (Widget m v a s n c) (WindowT s m v) _window' = _window {-# INLINABLE _window' #-}  -- | non polymorphic lens to the gadget of a widget-_gadget' :: Lens' (Widget v m r a s n c) (GadgetT a s n c)+_gadget' :: Lens' (Widget m v a s n c) (GadgetT a s n c) _gadget' = _gadget {-# INLINABLE _gadget' #-} -_Widget :: Iso (Widget v m r a s n c) (Widget v' m' r' a' s' n' c')-           (s -> v -> m (r, v), a -> s -> n (c, s)) (s' -> v' -> m' (r', v'), a' -> s' -> n' (c', s'))+_Widget :: Iso (Widget m v a s n c) (Widget m' v' a' s' n' c')+           (s -> m v, a -> s -> n (c, s)) (s' -> m' v', a' -> s' -> n' (c', s')) _Widget = iso (\(Widget w g) -> (view _WindowT w, view _GadgetT g))                (\(w, g) -> Widget (review _WindowT w) (review _GadgetT g)) {-# INLINABLE _Widget #-}  -- | Non polymorphic version of _Widget-_Widget' :: Iso' (Widget v m r a s n c) (s -> v -> m (r, v), a -> s -> n (c, s))+_Widget' :: Iso' (Widget m v a s n c) (s -> m v, a -> s -> n (c, s)) _Widget' = _Widget {-# INLINABLE _Widget' #-} -_WrappingWidget :: Iso (Widget v m r a s n c) (Widget v' m' r' a' s' n' c')-           (WindowT s v m r, GadgetT a s n c) (WindowT s' v' m' r', GadgetT a' s' n' c')+_WrappingWidget :: Iso (Widget m v a s n c) (Widget m' v' a' s' n' c')+           (WindowT s m v, GadgetT a s n c) (WindowT s' m' v', GadgetT a' s' n' c') _WrappingWidget = iso (\(Widget w g) -> (w, g))                (\(w, g) -> Widget w g) {-# INLINABLE _WrappingWidget #-}  -- | Non polymorphic version of _WrappingWidget-_WrappingWidget' :: Iso' (Widget v m r a s n c) (WindowT s v m r, GadgetT a s n c)+_WrappingWidget' :: Iso' (Widget m v a s n c) (WindowT s m v, GadgetT a s n c) _WrappingWidget' = _WrappingWidget {-# INLINABLE _WrappingWidget' #-} -mkWidget :: (WindowT s v m r, GadgetT a s n c) -> Widget v m r a s n c+mkWidget :: (WindowT s m v, GadgetT a s n c) -> Widget m v a s n c mkWidget = review _WrappingWidget {-# INLINABLE mkWidget #-} -mkWidget' :: (s -> v -> m (r, v), a -> s -> n (c, s)) -> Widget v m r a s n c+mkWidget' :: (s -> m v, a -> s -> n (c, s)) -> Widget m v a s n c mkWidget' = review _Widget {-# INLINABLE mkWidget' #-} -runWidget :: Widget v m r a s n c -> (WindowT s v m r, GadgetT a s n c)+runWidget :: Widget m v a s n c -> (WindowT s m v, GadgetT a s n c) runWidget = view _WrappingWidget {-# INLINABLE runWidget #-} -runWidget' :: Widget v m r a s n c -> (s -> v -> m (r, v), a -> s -> n (c, s))+runWidget' :: Widget m v a s n c -> (s -> m v, a -> s -> n (c, s)) runWidget' = view _Widget {-# INLINABLE runWidget' #-}  belowWidget ::-  ((s -> v -> m (r, v), a -> s -> n (c, s))-   -> (s' -> v' -> m' (r', v'), a' -> s' -> n' (c', s')))-  -> Widget v m r a s n c -> Widget v' m' r' a' s' n' c'+  ((s -> m v, a -> s -> n (c, s))+   -> (s' -> m' v', a' -> s' -> n' (c', s')))+  -> Widget m v a s n c -> Widget m' v' a' s' n' c' belowWidget f = _Widget %~ f {-# INLINABLE belowWidget #-}  underWidget ::-  ((WindowT s v m r, GadgetT a s n c)-   -> (WindowT s' v' m' r', GadgetT a' s' n' c'))-  -> Widget v m r a s n c -> Widget v' m' r' a' s' n' c'+  ((WindowT s m v, GadgetT a s n c)+   -> (WindowT s' m' v', GadgetT a' s' n' c'))+  -> Widget m v a s n c -> Widget m' v' a' s' n' c' underWidget f = _WrappingWidget %~ f {-# INLINABLE underWidget #-}  overWidget ::-  (Widget v m r a s n c -> Widget v' m' r' a' s' n' c')-  -> (WindowT s v m r, GadgetT a s n c)-  -> (WindowT s' v' m' r', GadgetT a' s' n' c')+  (Widget m v a s n c -> Widget m' v' a' s' n' c')+  -> (WindowT s m v, GadgetT a s n c)+  -> (WindowT s' m' v', GadgetT a' s' n' c') overWidget f = from _WrappingWidget %~ f {-# INLINABLE overWidget #-}  aboveWidget ::-  (Widget v m r a s n c -> Widget v' m' r' a' s' n' c')-  -> (s -> v -> m (r, v), a -> s -> n (c, s))-  -> (s' -> v' -> m' (r', v'), a' -> s' -> n' (c', s'))+  (Widget m v a s n c -> Widget m' v' a' s' n' c')+  -> (s -> m v, a -> s -> n (c, s))+  -> (s' -> m' v', a' -> s' -> n' (c', s')) aboveWidget f = from _Widget %~ f {-# INLINABLE aboveWidget #-} -instance (Monad m, Monad n, Semigroup r, Semigroup c) => Semigroup (Widget v m r a s n c) where+instance (Applicative m, Monad n, Semigroup v, Semigroup c) => Semigroup (Widget m v a s n c) where     w1 <> w2 = Widget       (window w1 <> window w2)       (gadget w1 <> gadget w2)     {-# INLINABLE (<>) #-} -instance (Monad m, Monad n, Monoid r, Monoid c) => Monoid (Widget v m r a s n c) where+instance (Applicative m, Monad n, Monoid v, Monoid c) => Monoid (Widget m v a s n c) where     mempty = Widget mempty mempty     {-# INLINABLE mempty #-} @@ -145,7 +145,7 @@ -- (Widget w g) = Widget w (id <$> g) =  Widget w g -- 2: fmap (f . g) = fmap f . fmap g -- (Widget w gad) = Widget w ((f . g) <$> gad) = Widget w ((fmap f . fmap g) gad)-instance Functor n => Functor (Widget v m r a s n) where+instance Functor n => Functor (Widget m v a s n) where     fmap f (Widget w g) = Widget         w         (f <$> g)@@ -167,32 +167,32 @@ --     = Widget (uw <> mempty) (ug <*> pure y) --     = Widget (mempty <> uw) (pure ($ y) <*> ug) --     = Widget mempty (pure $y) <*> Widget uw ug-instance (Monad m, Monad n, Monoid r) => Applicative (Widget v m r a s n) where+instance (Applicative m, Monad n, Monoid v) => Applicative (Widget m v a s n) where     pure c = Widget mempty (pure c)     {-# INLINABLE pure #-}      (Widget w1 fg) <*> (Widget w2 g) = Widget (w1 `mappend` w2) (fg <*> g)     {-# INLINABLE (<*>) #-} -statically :: (Monad n, Monoid c) => WindowT s v m r -> Widget v m r a s n c+statically :: (Monad n, Monoid c) => WindowT s m v -> Widget m v a s n c statically w = Widget w mempty {-# INLINABLE statically #-} -dynamically :: (Monad m, Monoid r) => GadgetT a s n c -> Widget v m r a s n c+dynamically :: (Applicative m, Monoid v) => GadgetT a s n c -> Widget m v a s n c dynamically = Widget mempty {-# INLINABLE dynamically #-} -type instance Dispatched (Widget v m r a s n c) = Dispatched (GadgetT a s n c)-instance Monad n => Dispatch (Widget v m r a s n c) (Widget v m r b s n c) a b where+type instance Dispatched (Widget m v a s n c) = Dispatched (GadgetT a s n c)+instance Monad n => Dispatch (Widget m v a s n c) (Widget m v b s n c) a b where     dispatch p w = Widget         (window w)         (dispatch p $ gadget w)     {-# INLINABLE dispatch #-} -type instance Implanted (Widget v m r a s n c) =-     PairMaybeFunctor (Implanted (WindowT s v m r))+type instance Implanted (Widget m v a s n c) =+     PairMaybeFunctor (Implanted (WindowT s m v))        (Implanted (GadgetT a s n c))-instance (Monad m, Monad n) => Implant (Widget v m r a s n c) (Widget v m r a t n c) s t where+instance (Monad m, Monad n) => Implant (Widget m v a s n c) (Widget m v a t n c) s t where     implant l w = Widget         (implant (fstLensLike l) $ window w)         (implant (sndLensLike l) $ gadget w)
src/Glazier/Window.hs view
@@ -43,23 +43,17 @@ import Control.Monad.Fix (MonadFix) import Control.Monad.Morph import Control.Monad.Reader-import Control.Monad.State.Strict import Data.Semigroup import Glazier.Class  -------------------------------------------------------------------------------  -- | The Elm view function is basically @view :: model -> html@--- This is be ehanced with monadic effects with ReaderT.--- The render output can be wrapped in a WriterT to make it more composable.--- We use a CPS-style WriterT (ie a StateT) to avoid space leaks.+-- This can be enhanced with monadic effects with ReaderT. -- This is named Window instead of View to avoid confusion with view from Control.Lens--- NB. This is the same formulation as 'Glaizer.GadgetT'.--- The only difference is 'WindowT' only has 'Glazier.Implant' instance.-newtype WindowT s v m r = WindowT-    { runWindowT :: ReaderT s (StateT v m) r-    } deriving ( MonadState v-               , MonadReader s+newtype WindowT s m v = WindowT+    { runWindowT :: ReaderT s m v+    } deriving ( MonadReader s                , Monad                , Applicative                , Functor@@ -72,81 +66,75 @@  makeWrapped ''WindowT -type Window s v = WindowT s v Identity+type Window s = WindowT s Identity -_WindowT :: Iso (WindowT s v m r) (WindowT s' v' m' r') (s -> v -> m (r, v)) (s' -> v' -> m' (r', v'))-_WindowT = _Wrapping WindowT . iso runReaderT ReaderT . iso (runStateT .) (StateT .)+_WindowT :: Iso (WindowT s m v) (WindowT s' m' v') (s -> m v) (s' -> m' v')+_WindowT = _Wrapping WindowT . iso runReaderT ReaderT {-# INLINABLE _WindowT #-}  -- | Non polymorphic version of _Window-_WindowT' :: Iso' (WindowT s v m r) (s -> v -> m (r, v))+_WindowT' :: Iso' (WindowT s m v) (s -> m v) _WindowT' = _WindowT {-# INLINABLE _WindowT' #-} -mkWindowT' :: (s -> v -> m (r, v)) -> WindowT s v m r+mkWindowT' :: (s -> m v) -> WindowT s m v mkWindowT' = review _WindowT {-# INLINABLE mkWindowT' #-} -runWindowT' :: WindowT s v m r -> (s -> v -> m (r, v))+runWindowT' :: WindowT s m v -> (s -> m v) runWindowT' = view _WindowT {-# INLINABLE runWindowT' #-}  belowWindowT ::-  ((s -> v -> m (r, v)) -> s' -> v' -> m' (r', v'))-  -> WindowT s v m r -> WindowT s' v' m' r'+  ((s -> m v) -> (s' -> m' v'))+  -> WindowT s m v -> WindowT s' m' v' belowWindowT f = _WindowT %~ f {-# INLINABLE belowWindowT #-}  underWindowT-    :: (ReaderT s (StateT v m) r -> ReaderT s' (StateT v' m') r')-    -> WindowT s v m r-    -> WindowT s' v' m' r'+    :: (ReaderT s m v -> ReaderT s' m' v')+    -> WindowT s m v+    -> WindowT s' m' v' underWindowT f = _Wrapping WindowT %~ f {-# INLINABLE underWindowT #-}  overWindowT-    :: (WindowT s v m r -> WindowT s' v' m' r')-    -> ReaderT s (StateT v m) r-    -> ReaderT s' (StateT v' m') r'+    :: (WindowT s m v -> WindowT s' m' v')+    -> ReaderT s m v+    -> ReaderT s' m' v' overWindowT f = _Unwrapping WindowT %~ f {-# INLINABLE overWindowT #-}  aboveWindowT ::-  (WindowT s v m r -> WindowT s' v' m' r')-  -> (s -> v -> m (r, v)) -> s' -> v' -> m' (r', v')+  (WindowT s m v -> WindowT s' m' v')+  -> (s -> m v) -> (s' -> m' v') aboveWindowT f = from _WindowT %~ f {-# INLINABLE aboveWindowT #-} -instance MonadTrans (WindowT s v) where-    lift = WindowT . lift . lift+instance MonadTrans (WindowT s) where+    lift = WindowT . lift -instance MFunctor (WindowT s v) where-    hoist f (WindowT m) = WindowT (hoist (hoist f) m)+instance MFunctor (WindowT s) where+    hoist f (WindowT m) = WindowT (hoist f m) -instance (Monad m, Semigroup r) => Semigroup (WindowT s v m r) where+instance (Applicative m, Semigroup v) => Semigroup (WindowT s m v) where     (WindowT f) <> (WindowT g) = WindowT $ (<>) <$> f <*> g     {-# INLINABLE (<>) #-} -instance (Monad m, Monoid r) => Monoid (WindowT s v m r) where+instance (Applicative m, Monoid v) => Monoid (WindowT s m v) where     mempty = WindowT $ pure mempty     {-# INLINABLE mempty #-}      (WindowT f) `mappend` (WindowT g) = WindowT $ mappend <$> f <*> g     {-# INLINABLE mappend #-} --- | zoom can be used to modify the state inside an Gadget-type instance Zoomed (WindowT s v m) = Zoomed (ReaderT s (StateT v m))-instance Monad m => Zoom (WindowT s v m) (WindowT s u m) v u where-    zoom l = WindowT . zoom l . runWindowT-    {-# INLINABLE zoom #-}- -- | magnify can be used to modify the action inside an Gadget-type instance Magnified (WindowT s v m) = Magnified (ReaderT s (StateT v m))-instance Monad m => Magnify (WindowT s v m) (WindowT t v m) s t where+type instance Magnified (WindowT s m) = Magnified (ReaderT s m)+instance Monad m => Magnify (WindowT s m) (WindowT t m) s t where     magnify l = WindowT . magnify l . runWindowT     {-# INLINABLE magnify #-} -type instance Implanted (WindowT s v m r) = Magnified (WindowT s v m) r-instance Monad m => Implant (WindowT s v m r) (WindowT t v m r) s t where+type instance Implanted (WindowT s m v) = Magnified (WindowT s m) v+instance Monad m => Implant (WindowT s m v) (WindowT t m v) s t where     implant = magnify     {-# INLINABLE implant #-}