glazier 0.6.2.2 → 0.7.0.0
raw patch · 11 files changed
+1056/−889 lines, 11 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Glazier: Window :: ReaderT s m v -> Window m s v
- Glazier: [runWindow] :: Window m s v -> ReaderT s m v
- Glazier: _Window :: Iso (Window m s v) (Window m' s' v') (s -> m v) (s' -> m' v')
- Glazier: _Window' :: Iso' (Window m s v) (s -> m v)
- Glazier: class Dispatch m n b a | m -> b, n -> a, m a -> n, n b -> m
- Glazier: class HasWindow s a | s -> a
- Glazier: class Implant m n s t | m -> s, n -> t, m t -> n, n s -> m
- Glazier: dispatch :: Dispatch m n b a => LensLike' (Dispatched m) a b -> m -> n
- Glazier: hoistWindow :: (Monad m) => (forall a. m a -> n a) -> Window m s v -> Window n s v
- Glazier: implant :: Implant m n s t => LensLike' (Implanted m) t s -> m -> n
- Glazier: instance (GHC.Base.Applicative m, Data.Semigroup.Semigroup v) => Data.Semigroup.Semigroup (Glazier.Window m s v)
- Glazier: instance (GHC.Base.Applicative m, GHC.Base.Monoid v) => GHC.Base.Monoid (Glazier.Window m s v)
- Glazier: instance Control.Lens.Wrapped.Wrapped (Glazier.Window m0 s0 v0)
- Glazier: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Window m s)
- Glazier: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Window m s)
- Glazier: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Window m s)
- Glazier: instance Control.Monad.Zip.MonadZip m => Control.Monad.Zip.MonadZip (Glazier.Window m s)
- Glazier: instance GHC.Base.Alternative m => GHC.Base.Alternative (Glazier.Window m s)
- Glazier: instance GHC.Base.Applicative m => GHC.Base.Applicative (Glazier.Window m s)
- Glazier: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Window m s)
- Glazier: instance GHC.Base.Monad m => Control.Arrow.Arrow (Glazier.Window m)
- Glazier: instance GHC.Base.Monad m => Control.Arrow.ArrowApply (Glazier.Window m)
- Glazier: instance GHC.Base.Monad m => Control.Arrow.ArrowChoice (Glazier.Window m)
- Glazier: instance GHC.Base.Monad m => Control.Category.Category (Glazier.Window m)
- Glazier: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader s (Glazier.Window m s)
- Glazier: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Window m)
- Glazier: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Window m)
- Glazier: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Window m)
- Glazier: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Window m s)
- Glazier: instance GHC.Base.Monad m => Glazier.Implant (Glazier.Window m s v) (Glazier.Window m t v) s t
- Glazier: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowPlus (Glazier.Window m)
- Glazier: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowZero (Glazier.Window m)
- Glazier: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Window m s)
- Glazier: instance Glazier.HasWindow (Glazier.Window m s v) (Glazier.Window m s v)
- Glazier: instance Glazier.Window m0 s0 v0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Window m1 s1 v1) t0
- Glazier: newtype Window m s v
- Glazier: window :: HasWindow s a => Lens' s a
- Glazier.Lazy: Gadget :: ReaderT a (StateT s m) c -> Gadget s m a c
- Glazier.Lazy: Widget :: Window m s v -> Gadget s m a c -> Widget s v m a c
- Glazier.Lazy: [runGadget] :: Gadget s m a c -> ReaderT a (StateT s m) c
- Glazier.Lazy: [widgetGadget] :: Widget s v m a c -> Gadget s m a c
- Glazier.Lazy: [widgetWindow] :: Widget s v m a c -> Window m s v
- Glazier.Lazy: _Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))
- Glazier.Lazy: _Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))
- Glazier.Lazy: _Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))
- Glazier.Lazy: _Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))
- Glazier.Lazy: _WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')
- Glazier.Lazy: _WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)
- Glazier.Lazy: class HasGadget s a | s -> a
- Glazier.Lazy: data Widget s v m a c
- Glazier.Lazy: dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c
- Glazier.Lazy: gadget :: HasGadget s a => Lens' s a
- Glazier.Lazy: hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c
- Glazier.Lazy: hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c
- Glazier.Lazy: instance (Data.Functor.Bind.Class.Apply f, Data.Functor.Bind.Class.Apply g) => Data.Functor.Bind.Class.Apply (Glazier.Lazy.PairMaybeFunctor f g)
- Glazier.Lazy: instance (Data.Functor.Contravariant.Contravariant f, Data.Functor.Contravariant.Contravariant g) => Data.Functor.Contravariant.Contravariant (Glazier.Lazy.PairMaybeFunctor f g)
- Glazier.Lazy: instance (Data.Semigroup.Semigroup v, GHC.Base.Monad m, GHC.Base.Monoid v) => GHC.Base.Applicative (Glazier.Lazy.Widget s v m a)
- Glazier.Lazy: instance (GHC.Base.Applicative f, GHC.Base.Applicative g) => GHC.Base.Applicative (Glazier.Lazy.PairMaybeFunctor f g)
- Glazier.Lazy: instance (GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (Glazier.Lazy.PairMaybeFunctor f g)
- Glazier.Lazy: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c) => Data.Semigroup.Semigroup (Glazier.Lazy.Gadget s m a c)
- Glazier.Lazy: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c, Data.Semigroup.Semigroup v) => Data.Semigroup.Semigroup (Glazier.Lazy.Widget s v m a c)
- Glazier.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid c) => GHC.Base.Monoid (Glazier.Lazy.Gadget s m a c)
- Glazier.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid c, GHC.Base.Monoid v) => GHC.Base.Monoid (Glazier.Lazy.Widget s v m a c)
- Glazier.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.Arrow (Glazier.Lazy.Widget s v m)
- Glazier.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.ArrowChoice (Glazier.Lazy.Widget s v m)
- Glazier.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Category.Category (Glazier.Lazy.Widget s v m)
- Glazier.Lazy: instance Control.Lens.Wrapped.Wrapped (Glazier.Lazy.Gadget s0 m0 a0 c0)
- Glazier.Lazy: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Lazy.Widget s v m a)
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Arrow.Arrow (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Arrow.ArrowApply (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Arrow.ArrowChoice (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Category.Category (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Lens.Zoom.Magnify (Glazier.Lazy.Gadget s m a) (Glazier.Lazy.Gadget s m b) a b
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Lens.Zoom.Zoom (Glazier.Lazy.Gadget s m a) (Glazier.Lazy.Gadget t m a) s t
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader a (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState s (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Lazy.Widget s v m)
- Glazier.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Lazy.Widget s v m)
- Glazier.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Lazy.Widget s v m)
- Glazier.Lazy: instance GHC.Base.Monad m => GHC.Base.Applicative (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance GHC.Base.Monad m => Glazier.Dispatch (Glazier.Lazy.Gadget s m a c) (Glazier.Lazy.Gadget s m b c) a b
- Glazier.Lazy: instance GHC.Base.Monad m => Glazier.Dispatch (Glazier.Lazy.Widget s v m a c) (Glazier.Lazy.Widget s v m b c) a b
- Glazier.Lazy: instance GHC.Base.Monad m => Glazier.Implant (Glazier.Lazy.Gadget s m a c) (Glazier.Lazy.Gadget t m a c) s t
- Glazier.Lazy: instance GHC.Base.Monad m => Glazier.Implant (Glazier.Lazy.Widget s v m a c) (Glazier.Lazy.Widget t v m a c) s t
- Glazier.Lazy: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowPlus (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowZero (Glazier.Lazy.Gadget s m)
- Glazier.Lazy: instance GHC.Base.MonadPlus m => GHC.Base.Alternative (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Lazy.Gadget s m a)
- Glazier.Lazy: instance Glazier.HasWindow (Glazier.Lazy.Widget s0 v0 m0 a0 c0) (Glazier.Window m0 s0 v0)
- Glazier.Lazy: instance Glazier.Lazy.Gadget s0 m0 a0 c0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Lazy.Gadget s1 m1 a1 c1) t0
- Glazier.Lazy: instance Glazier.Lazy.HasGadget (Glazier.Lazy.Gadget s m a c) (Glazier.Lazy.Gadget s m a c)
- Glazier.Lazy: instance Glazier.Lazy.HasGadget (Glazier.Lazy.Widget s0 v0 m0 a0 c0) (Glazier.Lazy.Gadget s0 m0 a0 c0)
- Glazier.Lazy: newtype Gadget s m a c
- Glazier.Lazy: statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c
- Glazier.Strict: Gadget :: ReaderT a (StateT s m) c -> Gadget s m a c
- Glazier.Strict: Widget :: Window m s v -> Gadget s m a c -> Widget s v m a c
- Glazier.Strict: [runGadget] :: Gadget s m a c -> ReaderT a (StateT s m) c
- Glazier.Strict: [widgetGadget] :: Widget s v m a c -> Gadget s m a c
- Glazier.Strict: [widgetWindow] :: Widget s v m a c -> Window m s v
- Glazier.Strict: _Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))
- Glazier.Strict: _Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))
- Glazier.Strict: _Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))
- Glazier.Strict: _Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))
- Glazier.Strict: _WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')
- Glazier.Strict: _WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)
- Glazier.Strict: class HasGadget s a | s -> a
- Glazier.Strict: data Widget s v m a c
- Glazier.Strict: dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c
- Glazier.Strict: gadget :: HasGadget s a => Lens' s a
- Glazier.Strict: hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c
- Glazier.Strict: hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c
- Glazier.Strict: instance (Data.Functor.Bind.Class.Apply f, Data.Functor.Bind.Class.Apply g) => Data.Functor.Bind.Class.Apply (Glazier.Strict.PairMaybeFunctor f g)
- Glazier.Strict: instance (Data.Functor.Contravariant.Contravariant f, Data.Functor.Contravariant.Contravariant g) => Data.Functor.Contravariant.Contravariant (Glazier.Strict.PairMaybeFunctor f g)
- Glazier.Strict: instance (Data.Semigroup.Semigroup v, GHC.Base.Monad m, GHC.Base.Monoid v) => GHC.Base.Applicative (Glazier.Strict.Widget s v m a)
- Glazier.Strict: instance (GHC.Base.Applicative f, GHC.Base.Applicative g) => GHC.Base.Applicative (Glazier.Strict.PairMaybeFunctor f g)
- Glazier.Strict: instance (GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (Glazier.Strict.PairMaybeFunctor f g)
- Glazier.Strict: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c) => Data.Semigroup.Semigroup (Glazier.Strict.Gadget s m a c)
- Glazier.Strict: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c, Data.Semigroup.Semigroup v) => Data.Semigroup.Semigroup (Glazier.Strict.Widget s v m a c)
- Glazier.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid c) => GHC.Base.Monoid (Glazier.Strict.Gadget s m a c)
- Glazier.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid c, GHC.Base.Monoid v) => GHC.Base.Monoid (Glazier.Strict.Widget s v m a c)
- Glazier.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.Arrow (Glazier.Strict.Widget s v m)
- Glazier.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.ArrowChoice (Glazier.Strict.Widget s v m)
- Glazier.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Category.Category (Glazier.Strict.Widget s v m)
- Glazier.Strict: instance Control.Lens.Wrapped.Wrapped (Glazier.Strict.Gadget s0 m0 a0 c0)
- Glazier.Strict: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Strict.Widget s v m a)
- Glazier.Strict: instance GHC.Base.Monad m => Control.Arrow.Arrow (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.Monad m => Control.Arrow.ArrowApply (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.Monad m => Control.Arrow.ArrowChoice (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.Monad m => Control.Category.Category (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.Monad m => Control.Lens.Zoom.Magnify (Glazier.Strict.Gadget s m a) (Glazier.Strict.Gadget s m b) a b
- Glazier.Strict: instance GHC.Base.Monad m => Control.Lens.Zoom.Zoom (Glazier.Strict.Gadget s m a) (Glazier.Strict.Gadget t m a) s t
- Glazier.Strict: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader a (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState s (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Strict.Widget s v m)
- Glazier.Strict: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Strict.Widget s v m)
- Glazier.Strict: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Strict.Widget s v m)
- Glazier.Strict: instance GHC.Base.Monad m => GHC.Base.Applicative (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance GHC.Base.Monad m => Glazier.Dispatch (Glazier.Strict.Gadget s m a c) (Glazier.Strict.Gadget s m b c) a b
- Glazier.Strict: instance GHC.Base.Monad m => Glazier.Dispatch (Glazier.Strict.Widget s v m a c) (Glazier.Strict.Widget s v m b c) a b
- Glazier.Strict: instance GHC.Base.Monad m => Glazier.Implant (Glazier.Strict.Gadget s m a c) (Glazier.Strict.Gadget t m a c) s t
- Glazier.Strict: instance GHC.Base.Monad m => Glazier.Implant (Glazier.Strict.Widget s v m a c) (Glazier.Strict.Widget t v m a c) s t
- Glazier.Strict: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowPlus (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowZero (Glazier.Strict.Gadget s m)
- Glazier.Strict: instance GHC.Base.MonadPlus m => GHC.Base.Alternative (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Strict.Gadget s m a)
- Glazier.Strict: instance Glazier.HasWindow (Glazier.Strict.Widget s0 v0 m0 a0 c0) (Glazier.Window m0 s0 v0)
- Glazier.Strict: instance Glazier.Strict.Gadget s0 m0 a0 c0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Strict.Gadget s1 m1 a1 c1) t0
- Glazier.Strict: instance Glazier.Strict.HasGadget (Glazier.Strict.Gadget s m a c) (Glazier.Strict.Gadget s m a c)
- Glazier.Strict: instance Glazier.Strict.HasGadget (Glazier.Strict.Widget s0 v0 m0 a0 c0) (Glazier.Strict.Gadget s0 m0 a0 c0)
- Glazier.Strict: newtype Gadget s m a c
- Glazier.Strict: statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c
+ Glazier.Class: class Dispatch m n b a | m -> b, n -> a, m a -> n, n b -> m
+ Glazier.Class: class Implant m n s t | m -> s, n -> t, m t -> n, n s -> m
+ Glazier.Class: dispatch :: Dispatch m n b a => LensLike' (Dispatched m) a b -> m -> n
+ Glazier.Class: implant :: Implant m n s t => LensLike' (Implanted m) t s -> m -> n
+ Glazier.Gadget.Lazy: Gadget :: ReaderT a (StateT s m) c -> Gadget s m a c
+ Glazier.Gadget.Lazy: [runGadget] :: Gadget s m a c -> ReaderT a (StateT s m) c
+ Glazier.Gadget.Lazy: _Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))
+ Glazier.Gadget.Lazy: _Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))
+ Glazier.Gadget.Lazy: class HasGadget s a | s -> a
+ Glazier.Gadget.Lazy: gadget :: HasGadget s a => Lens' s a
+ Glazier.Gadget.Lazy: hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c
+ Glazier.Gadget.Lazy: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c) => Data.Semigroup.Semigroup (Glazier.Gadget.Lazy.Gadget s m a c)
+ Glazier.Gadget.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid c) => GHC.Base.Monoid (Glazier.Gadget.Lazy.Gadget s m a c)
+ Glazier.Gadget.Lazy: instance Control.Lens.Wrapped.Wrapped (Glazier.Gadget.Lazy.Gadget s0 m0 a0 c0)
+ Glazier.Gadget.Lazy: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Arrow.Arrow (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Arrow.ArrowApply (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Arrow.ArrowChoice (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Category.Category (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Lens.Zoom.Magnify (Glazier.Gadget.Lazy.Gadget s m a) (Glazier.Gadget.Lazy.Gadget s m b) a b
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Lens.Zoom.Zoom (Glazier.Gadget.Lazy.Gadget s m a) (Glazier.Gadget.Lazy.Gadget t m a) s t
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader a (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState s (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => GHC.Base.Applicative (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Glazier.Class.Dispatch (Glazier.Gadget.Lazy.Gadget s m a c) (Glazier.Gadget.Lazy.Gadget s m b c) a b
+ Glazier.Gadget.Lazy: instance GHC.Base.Monad m => Glazier.Class.Implant (Glazier.Gadget.Lazy.Gadget s m a c) (Glazier.Gadget.Lazy.Gadget t m a c) s t
+ Glazier.Gadget.Lazy: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowPlus (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowZero (Glazier.Gadget.Lazy.Gadget s m)
+ Glazier.Gadget.Lazy: instance GHC.Base.MonadPlus m => GHC.Base.Alternative (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Gadget.Lazy.Gadget s m a)
+ Glazier.Gadget.Lazy: instance Glazier.Gadget.Lazy.Gadget s0 m0 a0 c0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Gadget.Lazy.Gadget s1 m1 a1 c1) t0
+ Glazier.Gadget.Lazy: instance Glazier.Gadget.Lazy.HasGadget (Glazier.Gadget.Lazy.Gadget s m a c) (Glazier.Gadget.Lazy.Gadget s m a c)
+ Glazier.Gadget.Lazy: newtype Gadget s m a c
+ Glazier.Gadget.Strict: Gadget :: ReaderT a (StateT s m) c -> Gadget s m a c
+ Glazier.Gadget.Strict: [runGadget] :: Gadget s m a c -> ReaderT a (StateT s m) c
+ Glazier.Gadget.Strict: _Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))
+ Glazier.Gadget.Strict: _Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))
+ Glazier.Gadget.Strict: class HasGadget s a | s -> a
+ Glazier.Gadget.Strict: gadget :: HasGadget s a => Lens' s a
+ Glazier.Gadget.Strict: hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c
+ Glazier.Gadget.Strict: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c) => Data.Semigroup.Semigroup (Glazier.Gadget.Strict.Gadget s m a c)
+ Glazier.Gadget.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid c) => GHC.Base.Monoid (Glazier.Gadget.Strict.Gadget s m a c)
+ Glazier.Gadget.Strict: instance Control.Lens.Wrapped.Wrapped (Glazier.Gadget.Strict.Gadget s0 m0 a0 c0)
+ Glazier.Gadget.Strict: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Arrow.Arrow (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Arrow.ArrowApply (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Arrow.ArrowChoice (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Category.Category (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Lens.Zoom.Magnify (Glazier.Gadget.Strict.Gadget s m a) (Glazier.Gadget.Strict.Gadget s m b) a b
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Lens.Zoom.Zoom (Glazier.Gadget.Strict.Gadget s m a) (Glazier.Gadget.Strict.Gadget t m a) s t
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader a (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState s (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => GHC.Base.Applicative (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Glazier.Class.Dispatch (Glazier.Gadget.Strict.Gadget s m a c) (Glazier.Gadget.Strict.Gadget s m b c) a b
+ Glazier.Gadget.Strict: instance GHC.Base.Monad m => Glazier.Class.Implant (Glazier.Gadget.Strict.Gadget s m a c) (Glazier.Gadget.Strict.Gadget t m a c) s t
+ Glazier.Gadget.Strict: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowPlus (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowZero (Glazier.Gadget.Strict.Gadget s m)
+ Glazier.Gadget.Strict: instance GHC.Base.MonadPlus m => GHC.Base.Alternative (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Gadget.Strict.Gadget s m a)
+ Glazier.Gadget.Strict: instance Glazier.Gadget.Strict.Gadget s0 m0 a0 c0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Gadget.Strict.Gadget s1 m1 a1 c1) t0
+ Glazier.Gadget.Strict: instance Glazier.Gadget.Strict.HasGadget (Glazier.Gadget.Strict.Gadget s m a c) (Glazier.Gadget.Strict.Gadget s m a c)
+ Glazier.Gadget.Strict: newtype Gadget s m a c
+ Glazier.Widget.Lazy: Widget :: Window m s v -> Gadget s m a c -> Widget s v m a c
+ Glazier.Widget.Lazy: [widgetGadget] :: Widget s v m a c -> Gadget s m a c
+ Glazier.Widget.Lazy: [widgetWindow] :: Widget s v m a c -> Window m s v
+ Glazier.Widget.Lazy: _Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))
+ Glazier.Widget.Lazy: _Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))
+ Glazier.Widget.Lazy: _WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')
+ Glazier.Widget.Lazy: _WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)
+ Glazier.Widget.Lazy: data Widget s v m a c
+ Glazier.Widget.Lazy: dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c
+ Glazier.Widget.Lazy: hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c
+ Glazier.Widget.Lazy: instance (Data.Functor.Bind.Class.Apply f, Data.Functor.Bind.Class.Apply g) => Data.Functor.Bind.Class.Apply (Glazier.Widget.Lazy.PairMaybeFunctor f g)
+ Glazier.Widget.Lazy: instance (Data.Functor.Contravariant.Contravariant f, Data.Functor.Contravariant.Contravariant g) => Data.Functor.Contravariant.Contravariant (Glazier.Widget.Lazy.PairMaybeFunctor f g)
+ Glazier.Widget.Lazy: instance (Data.Semigroup.Semigroup v, GHC.Base.Monad m, GHC.Base.Monoid v) => GHC.Base.Applicative (Glazier.Widget.Lazy.Widget s v m a)
+ Glazier.Widget.Lazy: instance (GHC.Base.Applicative f, GHC.Base.Applicative g) => GHC.Base.Applicative (Glazier.Widget.Lazy.PairMaybeFunctor f g)
+ Glazier.Widget.Lazy: instance (GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (Glazier.Widget.Lazy.PairMaybeFunctor f g)
+ Glazier.Widget.Lazy: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c, Data.Semigroup.Semigroup v) => Data.Semigroup.Semigroup (Glazier.Widget.Lazy.Widget s v m a c)
+ Glazier.Widget.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid c, GHC.Base.Monoid v) => GHC.Base.Monoid (Glazier.Widget.Lazy.Widget s v m a c)
+ Glazier.Widget.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.Arrow (Glazier.Widget.Lazy.Widget s v m)
+ Glazier.Widget.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.ArrowChoice (Glazier.Widget.Lazy.Widget s v m)
+ Glazier.Widget.Lazy: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Category.Category (Glazier.Widget.Lazy.Widget s v m)
+ Glazier.Widget.Lazy: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Widget.Lazy.Widget s v m a)
+ Glazier.Widget.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Widget.Lazy.Widget s v m)
+ Glazier.Widget.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Widget.Lazy.Widget s v m)
+ Glazier.Widget.Lazy: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Widget.Lazy.Widget s v m)
+ Glazier.Widget.Lazy: instance GHC.Base.Monad m => Glazier.Class.Dispatch (Glazier.Widget.Lazy.Widget s v m a c) (Glazier.Widget.Lazy.Widget s v m b c) a b
+ Glazier.Widget.Lazy: instance GHC.Base.Monad m => Glazier.Class.Implant (Glazier.Widget.Lazy.Widget s v m a c) (Glazier.Widget.Lazy.Widget t v m a c) s t
+ Glazier.Widget.Lazy: instance Glazier.Gadget.Lazy.HasGadget (Glazier.Widget.Lazy.Widget s0 v0 m0 a0 c0) (Glazier.Gadget.Lazy.Gadget s0 m0 a0 c0)
+ Glazier.Widget.Lazy: instance Glazier.Window.HasWindow (Glazier.Widget.Lazy.Widget s0 v0 m0 a0 c0) (Glazier.Window.Window m0 s0 v0)
+ Glazier.Widget.Lazy: statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c
+ Glazier.Widget.Strict: Widget :: Window m s v -> Gadget s m a c -> Widget s v m a c
+ Glazier.Widget.Strict: [widgetGadget] :: Widget s v m a c -> Gadget s m a c
+ Glazier.Widget.Strict: [widgetWindow] :: Widget s v m a c -> Window m s v
+ Glazier.Widget.Strict: _Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))
+ Glazier.Widget.Strict: _Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))
+ Glazier.Widget.Strict: _WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c') (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')
+ Glazier.Widget.Strict: _WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)
+ Glazier.Widget.Strict: data Widget s v m a c
+ Glazier.Widget.Strict: dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c
+ Glazier.Widget.Strict: hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c
+ Glazier.Widget.Strict: instance (Data.Functor.Bind.Class.Apply f, Data.Functor.Bind.Class.Apply g) => Data.Functor.Bind.Class.Apply (Glazier.Widget.Strict.PairMaybeFunctor f g)
+ Glazier.Widget.Strict: instance (Data.Functor.Contravariant.Contravariant f, Data.Functor.Contravariant.Contravariant g) => Data.Functor.Contravariant.Contravariant (Glazier.Widget.Strict.PairMaybeFunctor f g)
+ Glazier.Widget.Strict: instance (Data.Semigroup.Semigroup v, GHC.Base.Monad m, GHC.Base.Monoid v) => GHC.Base.Applicative (Glazier.Widget.Strict.Widget s v m a)
+ Glazier.Widget.Strict: instance (GHC.Base.Applicative f, GHC.Base.Applicative g) => GHC.Base.Applicative (Glazier.Widget.Strict.PairMaybeFunctor f g)
+ Glazier.Widget.Strict: instance (GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (Glazier.Widget.Strict.PairMaybeFunctor f g)
+ Glazier.Widget.Strict: instance (GHC.Base.Monad m, Data.Semigroup.Semigroup c, Data.Semigroup.Semigroup v) => Data.Semigroup.Semigroup (Glazier.Widget.Strict.Widget s v m a c)
+ Glazier.Widget.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid c, GHC.Base.Monoid v) => GHC.Base.Monoid (Glazier.Widget.Strict.Widget s v m a c)
+ Glazier.Widget.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.Arrow (Glazier.Widget.Strict.Widget s v m)
+ Glazier.Widget.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Arrow.ArrowChoice (Glazier.Widget.Strict.Widget s v m)
+ Glazier.Widget.Strict: instance (GHC.Base.Monad m, GHC.Base.Monoid v) => Control.Category.Category (Glazier.Widget.Strict.Widget s v m)
+ Glazier.Widget.Strict: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Widget.Strict.Widget s v m a)
+ Glazier.Widget.Strict: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Widget.Strict.Widget s v m)
+ Glazier.Widget.Strict: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Widget.Strict.Widget s v m)
+ Glazier.Widget.Strict: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Widget.Strict.Widget s v m)
+ Glazier.Widget.Strict: instance GHC.Base.Monad m => Glazier.Class.Dispatch (Glazier.Widget.Strict.Widget s v m a c) (Glazier.Widget.Strict.Widget s v m b c) a b
+ Glazier.Widget.Strict: instance GHC.Base.Monad m => Glazier.Class.Implant (Glazier.Widget.Strict.Widget s v m a c) (Glazier.Widget.Strict.Widget t v m a c) s t
+ Glazier.Widget.Strict: instance Glazier.Gadget.Strict.HasGadget (Glazier.Widget.Strict.Widget s0 v0 m0 a0 c0) (Glazier.Gadget.Strict.Gadget s0 m0 a0 c0)
+ Glazier.Widget.Strict: instance Glazier.Window.HasWindow (Glazier.Widget.Strict.Widget s0 v0 m0 a0 c0) (Glazier.Window.Window m0 s0 v0)
+ Glazier.Widget.Strict: statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c
+ Glazier.Window: Window :: ReaderT s m v -> Window m s v
+ Glazier.Window: [runWindow] :: Window m s v -> ReaderT s m v
+ Glazier.Window: _Window :: Iso (Window m s v) (Window m' s' v') (s -> m v) (s' -> m' v')
+ Glazier.Window: _Window' :: Iso' (Window m s v) (s -> m v)
+ Glazier.Window: class HasWindow s a | s -> a
+ Glazier.Window: hoistWindow :: (Monad m) => (forall a. m a -> n a) -> Window m s v -> Window n s v
+ Glazier.Window: instance (GHC.Base.Applicative m, Data.Semigroup.Semigroup v) => Data.Semigroup.Semigroup (Glazier.Window.Window m s v)
+ Glazier.Window: instance (GHC.Base.Applicative m, GHC.Base.Monoid v) => GHC.Base.Monoid (Glazier.Window.Window m s v)
+ Glazier.Window: instance Control.Lens.Wrapped.Wrapped (Glazier.Window.Window m0 s0 v0)
+ Glazier.Window: instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (Glazier.Window.Window m s)
+ Glazier.Window: instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Glazier.Window.Window m s)
+ Glazier.Window: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Glazier.Window.Window m s)
+ Glazier.Window: instance Control.Monad.Zip.MonadZip m => Control.Monad.Zip.MonadZip (Glazier.Window.Window m s)
+ Glazier.Window: instance GHC.Base.Alternative m => GHC.Base.Alternative (Glazier.Window.Window m s)
+ Glazier.Window: instance GHC.Base.Applicative m => GHC.Base.Applicative (Glazier.Window.Window m s)
+ Glazier.Window: instance GHC.Base.Functor m => GHC.Base.Functor (Glazier.Window.Window m s)
+ Glazier.Window: instance GHC.Base.Monad m => Control.Arrow.Arrow (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.Monad m => Control.Arrow.ArrowApply (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.Monad m => Control.Arrow.ArrowChoice (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.Monad m => Control.Category.Category (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader s (Glazier.Window.Window m s)
+ Glazier.Window: instance GHC.Base.Monad m => Data.Profunctor.Choice.Choice (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.Monad m => Data.Profunctor.Strong.Strong (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.Monad m => Data.Profunctor.Unsafe.Profunctor (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.Monad m => GHC.Base.Monad (Glazier.Window.Window m s)
+ Glazier.Window: instance GHC.Base.Monad m => Glazier.Class.Implant (Glazier.Window.Window m s v) (Glazier.Window.Window m t v) s t
+ Glazier.Window: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowPlus (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.MonadPlus m => Control.Arrow.ArrowZero (Glazier.Window.Window m)
+ Glazier.Window: instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Glazier.Window.Window m s)
+ Glazier.Window: instance Glazier.Window.HasWindow (Glazier.Window.Window m s v) (Glazier.Window.Window m s v)
+ Glazier.Window: instance Glazier.Window.Window m0 s0 v0 ~ t0 => Control.Lens.Wrapped.Rewrapped (Glazier.Window.Window m1 s1 v1) t0
+ Glazier.Window: newtype Window m s v
+ Glazier.Window: window :: HasWindow s a => Lens' s a
Files
- glazier.cabal +8/−4
- src/Glazier.hs +8/−184
- src/Glazier/Class.hs +20/−0
- src/Glazier/Example.hs +0/−1
- src/Glazier/Gadget/Lazy.hs +173/−0
- src/Glazier/Gadget/Strict.hs +173/−0
- src/Glazier/Lazy.hs +0/−350
- src/Glazier/Strict.hs +0/−350
- src/Glazier/Widget/Lazy.hs +245/−0
- src/Glazier/Widget/Strict.hs +245/−0
- src/Glazier/Window.hs +184/−0
glazier.cabal view
@@ -1,5 +1,5 @@ name: glazier-version: 0.6.2.2+version: 0.7.0.0 synopsis: Composable widgets framework description: Please see README.md homepage: https://github.com/louispan/glazier#readme@@ -16,9 +16,13 @@ library hs-source-dirs: src exposed-modules: Glazier- , Glazier.Example- , Glazier.Lazy- , Glazier.Strict+ Glazier.Class+ Glazier.Example+ Glazier.Gadget.Lazy+ Glazier.Gadget.Strict+ Glazier.Widget.Lazy+ Glazier.Widget.Strict+ Glazier.Window build-depends: base >= 4.7 && < 5 , lens >= 4 && < 5 , mmorph >= 1 && < 2
src/Glazier.hs view
@@ -1,187 +1,11 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}---- | Functional version of (Elm View/Update & startApp architecture) enabling composable widgets, and a FRP-like framework.------ This framework makes it easier to modularize the Elm architecture idea of View/Update:--- based on the deprecated Elm Architecture version of Jan 2016--- https://github.com/evancz/elm-architecture-tutorial/tree/de5682a5a8e4459aed4637533adb25e462f8a2ae------ The Elm View/Update is basically as follows:------ @--- data Model = Blah....--- data Action = DoThis | DoThat deriving Show------ -- | update is fired from an event processing loop--- update :: Action -> Model -> Model------ -- | The widget from 'view' knows how to send Action to a mailbox--- view :: Signal Address -> Model -> Html--- @------ This module uses isomorphic Window and Gadget resulting in instances can be be composed together into larger Widgets.--- Original inspiration from https://arianvp.me/lenses-and-prisms-for-modular-clientside-apps/------ This framework provides three main combinators:--- * Semigroup and Monoid instances for concatenating widgets.--- * 'dispatch' is used to re-route the action type.--- * 'implant' is used to modify the model type. module Glazier- ( Window(..)- , HasWindow(..)- , _Window- , _Window'- , hoistWindow- , Implanted- , Implant(..)- , Dispatched- , Dispatch(..)+ ( module Glazier.Class+ , module Glazier.Window+ , module Glazier.Gadget.Strict+ , module Glazier.Widget.Strict ) where -import Control.Applicative-import Control.Arrow-import qualified Control.Category as C-import Control.Lens-import qualified Control.Lens.Internal.Zoom as Z-import qualified Control.Monad.Fail as Fail-import Control.Monad.Fix (MonadFix)-import Control.Monad.Morph-import Control.Monad.Reader-import Control.Monad.Zip (MonadZip)-import Data.Profunctor-import Data.Semigroup------------------------------------------------------------------------------------- | The Elm view function is basically @view :: model -> html@--- NB. elm-html is actually @view :: Signal.Address action -> model -> html@--- where @Signal.Address action@ is the Pipes.Concurrent.Output that is sent--- actions (eg. when html button is clicked).--- This address argument is not required in the general case, and is only required for specific widgets on an as needed basis.--- Therefore, using the fundamental type of @view :: model -> html@--- This is be ehanced with monadic effects with ReaderT.--- This is named Window instead of View to avoid confusion with view from Control.Lens-newtype Window m s v = Window- { runWindow :: ReaderT s m v- } deriving ( MonadReader s- , Monad- , Applicative- , Functor- , Fail.MonadFail- , Alternative- , MonadPlus- , MonadFix- , MonadIO- , MonadZip- )-class HasWindow s a | s -> a where- window :: Lens' s a--instance HasWindow (Window m s v) (Window m s v) where- window = id--makeWrapped ''Window---- | NB lift can be simulated:--- liftWindow :: (MonadTrans t, Monad m) => Window m s v -> Window (t m) s v--- liftWindow = hoistWindow lift-hoistWindow :: (Monad m) => (forall a. m a -> n a) -> Window m s v -> Window n s v-hoistWindow g = _Wrapping Window %~ hoist g---- | This Iso gives the following functions:------ @--- liftWindow :: (MonadTrans t, Monad m) => Window m s v -> Window (t m) s v--- liftWindow = hoistWindow lift------ underWindow :: (ReaderT s m v -> ReaderT s' m' v') -> Window m s v -> Window m' s' v'--- underWindow f = _Wrapping Window %~ f------ overWindow :: (Window m s v -> Window m' s' v') -> ReaderT s m v -> ReaderT s' m' v'--- overWindow f = _Unwrapping Window %~ f------ belowWindow :: ((s -> m v) -> (s' -> m' v')) -> Window m s v -> Window m' s' v'--- belowWindow f = _Window %~ f------ aboveWindow :: (Window m s v -> Window m' s' v') -> (s -> m v) -> (s' -> m' v')--- aboveWindow f = from _Window %~ f------ mkWindow' :: (s -> m v) -> Window m s v--- mkWindow' = review _Window------ runWindow' :: Window m s v -> (s -> m v)--- runWindow' = view _Window--- @----_Window :: Iso (Window m s v) (Window m' s' v') (s -> m v) (s' -> m' v')-_Window = _Wrapping Window . iso runReaderT ReaderT -- lens 4.15.1 doesn't have a general enough ReaderT iso---- | Non polymorphic version of _Window-_Window' :: Iso' (Window m s v) (s -> m v)-_Window' = _Window--instance (Applicative m, Semigroup v) => Semigroup (Window m s v) where- (Window f) <> (Window g) = Window $ ReaderT $ \a ->- (<>) <$> runReaderT f a <*> runReaderT g a--instance (Applicative m, Monoid v) => Monoid (Window m s v) where- mempty = Window $ ReaderT $ const $ pure mempty- (Window f) `mappend` (Window g) = Window $ ReaderT $ \a ->- mappend <$> runReaderT f a <*> runReaderT g a--instance Monad m => Profunctor (Window m) where- dimap f g = _Window %~ (runKleisli . dimap f g . Kleisli)--instance Monad m => Strong (Window m) where- first' = _Window %~ (runKleisli . first' . Kleisli)--instance Monad m => C.Category (Window m) where- id = Window . ReaderT $ runKleisli C.id- Window (ReaderT k) . Window (ReaderT l) = Window . ReaderT . runKleisli $ Kleisli k C.. Kleisli l--instance Monad m => Arrow (Window m) where- arr f = Window $ ReaderT $ runKleisli $ arr f- first = _Window %~ (runKleisli . first . Kleisli)--instance Monad m => Choice (Window m) where- left' = _Window %~ (runKleisli . left' . Kleisli)--instance Monad m => ArrowChoice (Window m) where- left = _Window %~ (runKleisli . left . Kleisli)--instance Monad m => ArrowApply (Window m) where- app = Window . ReaderT $ \(Window (ReaderT bc), b) -> bc b--instance MonadPlus m => ArrowZero (Window m) where- zeroArrow = Window mzero--instance MonadPlus m => ArrowPlus (Window m) where- Window a <+> Window b = Window (a `mplus` b)------------------------------------------------------------------------------------- | Modify the state given a lens, prism or traversal.--- NB. This is 'Control.Lens.Zoom' for Notify.-type family Implanted m :: * -> *-class Implant m n s t | m -> s, n -> t, m t -> n, n s -> m where- implant :: LensLike' (Implanted m) t s -> m -> n--type instance Implanted (Window m s v) = Z.Effect m v-instance Monad m => Implant (Window m s v) (Window m t v) s t where- implant l (Window m) = Window $ magnify l m----------------------------------------------------------------------------------type family Dispatched m :: * -> *---- | Changes the action type given a lens, prism or traversal-class Dispatch m n b a | m -> b, n -> a, m a -> n, n b -> m where- dispatch :: LensLike' (Dispatched m) a b -> m -> n+import Glazier.Class+import Glazier.Window+import Glazier.Gadget.Strict+import Glazier.Widget.Strict
+ src/Glazier/Class.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-}++module Glazier.Class where++import Control.Lens++-- | Modify the state given a lens, prism or traversal.+-- NB. This is 'Control.Lens.Zoom' for Notify.+type family Implanted m :: * -> *+class Implant m n s t | m -> s, n -> t, m t -> n, n s -> m where+ implant :: LensLike' (Implanted m) t s -> m -> n++-------------------------------------------------------------------------------+type family Dispatched m :: * -> *++-- | Changes the action type given a lens, prism or traversal+class Dispatch m n b a | m -> b, n -> a, m a -> n, n b -> m where+ dispatch :: LensLike' (Dispatched m) a b -> m -> n
src/Glazier/Example.hs view
@@ -17,7 +17,6 @@ import Data.List import Data.Semigroup import Glazier-import Glazier.Strict import Prelude hiding (id, (.)) newtype Action a = Action { getAction :: a }
+ src/Glazier/Gadget/Lazy.hs view
@@ -0,0 +1,173 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++module Glazier.Gadget.Lazy where++import Control.Applicative+import Control.Arrow+import qualified Control.Category as C+import Control.Lens+import qualified Control.Monad.Fail as Fail+import Control.Monad.Fix (MonadFix)+import Control.Monad.Morph+import Control.Monad.Reader+import Control.Monad.State.Lazy+import Data.Profunctor+import Data.Semigroup+import Glazier.Class++-- | The Elm update function is @a -> s -> (s, c)@+-- This is isomorphic to @ReaderT a (State s) c@+-- ie, given an action "a", and a current state "s", return the new state "s"+-- and any commands "c" that need to be interpreted externally (eg. download file).+-- This is named Gadget instead of Update to avoid confusion with update from Data.Map+newtype Gadget s m a c = Gadget+ { runGadget :: ReaderT a (StateT s m) c+ } deriving ( MonadState s+ , MonadReader a+ , Monad+ , Applicative+ , Functor+ , Fail.MonadFail+ , Alternative+ , MonadPlus+ , MonadFix+ , MonadIO+ )++class HasGadget s a | s -> a where+ gadget :: Lens' s a++instance HasGadget (Gadget s m a c) (Gadget s m a c) where+ gadget = id++makeWrapped ''Gadget++-- | NB lift can be simulated:+-- liftGadget :: (MonadTrans t, Monad m) => Gadget s m a c -> Gadget s (t m) a c+-- liftGadget = _Wrapping Gadget %~ hoist (hoist lift)+hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c+hoistGadget g = _Wrapping Gadget %~ hoist (hoist g)+{-# INLINABLE hoistGadget #-}++-- | This Iso gives the following functions:+--+-- @+-- underGadget :: (ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c') -> Gadget s m a c -> Gadget s' m' a' c'+-- underGadget f = _Wrapping Gadget %~ f+--+-- overGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c'+-- overGadget f = _Unwrapping Gadget %~ f+--+-- belowGadget :: (a -> s -> m (c, s)) (a' -> s' -> m' (c', s')) -> Gadget s m a c -> Gadget s' m' a' c'+-- belowGadget f = _Gadget %~ f+--+-- aboveGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))+-- aboveGadget f = from _Gadget %~ f+--+-- mkGadget' :: (a -> s -> m (c, s)) -> Gadget s m a c+-- mkGadget' = review _Gadget+--+-- runGadget' :: Gadget s m a c -> (a -> s -> m (c, s))+-- runGadget' = view _Gadget+-- @+--+_Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))+_Gadget = _Wrapping Gadget . iso runReaderT ReaderT . iso (runStateT .) (StateT .)+{-# INLINABLE _Gadget #-}++-- | Non polymorphic version of _Gadget+_Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))+_Gadget' = _Gadget+{-# INLINABLE _Gadget' #-}++instance (Monad m, Semigroup c) => Semigroup (Gadget s m a c) where+ (Gadget f) <> (Gadget g) = Gadget $ (<>) <$> f <*> g+ {-# INLINABLE (<>) #-}++instance (Monad m, Monoid c) => Monoid (Gadget s m a c) where+ mempty = Gadget $ pure mempty+ {-# INLINABLE mempty #-}++ (Gadget f) `mappend` (Gadget g) = Gadget $ mappend <$> f <*> g+ {-# INLINABLE mappend #-}++instance Monad m => Profunctor (Gadget s m) where+ dimap f g (Gadget (ReaderT m)) = Gadget $ ReaderT $ \a -> StateT $ \s -> undefined+ (first g) <$> runStateT (m (f a)) s+ {-# INLINABLE dimap #-}++instance Monad m => Strong (Gadget s m) where+ first' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \(b, d) -> StateT $ \s ->+ (\(c, s') -> ((c, d), s')) <$> runStateT (bc b) s+ {-# INLINABLE first' #-}++instance Monad m => C.Category (Gadget s m) where+ id = Gadget $ ReaderT $ \a -> StateT $ \s -> pure (a, s)+ {-# INLINABLE id #-}++ Gadget (ReaderT bc) . Gadget (ReaderT ab) = Gadget $ ReaderT $ \a -> StateT $ \s -> do+ -- This line is the main difference between Strict and Lazy versions+ ~(b, s') <- runStateT (ab a) s+ runStateT (bc b) s'+ {-# INLINABLE (.) #-}++instance Monad m => Arrow (Gadget s m) where+ arr f = dimap f id C.id+ {-# INLINABLE arr #-}++ first = first'+ {-# INLINABLE first #-}++instance Monad m => Choice (Gadget s m) where+ left' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \db -> StateT $ \s -> case db of+ Left b -> do+ -- This line is the main difference between Strict and Lazy versions+ ~(c, s') <- runStateT (bc b) s+ pure (Left c, s')+ Right d -> pure (Right d, s)+ {-# INLINABLE left' #-}++instance Monad m => ArrowChoice (Gadget s m) where+ left = left'+ {-# INLINABLE left #-}++instance Monad m => ArrowApply (Gadget s m) where+ app = Gadget $ ReaderT $ \(Gadget (ReaderT bc), b) -> StateT $ \s -> runStateT (bc b) s+ {-# INLINABLE app #-}++instance MonadPlus m => ArrowZero (Gadget s m) where+ zeroArrow = Gadget mzero+ {-# INLINABLE zeroArrow #-}++instance MonadPlus m => ArrowPlus (Gadget s m) where+ Gadget a <+> Gadget b = Gadget (a `mplus` b)+ {-# INLINABLE (<+>) #-}++-- | zoom can be used to modify the state inside an Gadget+type instance Zoomed (Gadget s m a) = Zoomed (StateT s m)+instance Monad m => Zoom (Gadget s m a) (Gadget t m a) s t where+ zoom l = Gadget . zoom l . runGadget+ {-# INLINABLE zoom #-}++-- | magnify can be used to modify the action inside an Gadget+type instance Magnified (Gadget s m a) = Magnified (ReaderT a (StateT s m))+instance Monad m => Magnify (Gadget s m a) (Gadget s m b) a b where+ magnify l = Gadget . magnify l . runGadget+ {-# INLINABLE magnify #-}++type instance Implanted (Gadget s m a c) = Zoomed (Gadget s m a) c+instance Monad m => Implant (Gadget s m a c) (Gadget t m a c) s t where+ implant = zoom+ {-# INLINABLE implant #-}++type instance Dispatched (Gadget s m a c) = Magnified (Gadget s m a) c+instance Monad m => Dispatch (Gadget s m a c) (Gadget s m b c) a b where+ dispatch = magnify+ {-# INLINABLE dispatch #-}
+ src/Glazier/Gadget/Strict.hs view
@@ -0,0 +1,173 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++module Glazier.Gadget.Strict where++import Control.Applicative+import Control.Arrow+import qualified Control.Category as C+import Control.Lens+import qualified Control.Monad.Fail as Fail+import Control.Monad.Fix (MonadFix)+import Control.Monad.Morph+import Control.Monad.Reader+import Control.Monad.State.Strict+import Data.Profunctor+import Data.Semigroup+import Glazier.Class++-- | The Elm update function is @a -> s -> (s, c)@+-- This is isomorphic to @ReaderT a (State s) c@+-- ie, given an action "a", and a current state "s", return the new state "s"+-- and any commands "c" that need to be interpreted externally (eg. download file).+-- This is named Gadget instead of Update to avoid confusion with update from Data.Map+newtype Gadget s m a c = Gadget+ { runGadget :: ReaderT a (StateT s m) c+ } deriving ( MonadState s+ , MonadReader a+ , Monad+ , Applicative+ , Functor+ , Fail.MonadFail+ , Alternative+ , MonadPlus+ , MonadFix+ , MonadIO+ )++class HasGadget s a | s -> a where+ gadget :: Lens' s a++instance HasGadget (Gadget s m a c) (Gadget s m a c) where+ gadget = id++makeWrapped ''Gadget++-- | NB lift can be simulated:+-- liftGadget :: (MonadTrans t, Monad m) => Gadget s m a c -> Gadget s (t m) a c+-- liftGadget = _Wrapping Gadget %~ hoist (hoist lift)+hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c+hoistGadget g = _Wrapping Gadget %~ hoist (hoist g)+{-# INLINABLE hoistGadget #-}++-- | This Iso gives the following functions:+--+-- @+-- underGadget :: (ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c') -> Gadget s m a c -> Gadget s' m' a' c'+-- underGadget f = _Wrapping Gadget %~ f+--+-- overGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c'+-- overGadget f = _Unwrapping Gadget %~ f+--+-- belowGadget :: (a -> s -> m (c, s)) (a' -> s' -> m' (c', s')) -> Gadget s m a c -> Gadget s' m' a' c'+-- belowGadget f = _Gadget %~ f+--+-- aboveGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))+-- aboveGadget f = from _Gadget %~ f+--+-- mkGadget' :: (a -> s -> m (c, s)) -> Gadget s m a c+-- mkGadget' = review _Gadget+--+-- runGadget' :: Gadget s m a c -> (a -> s -> m (c, s))+-- runGadget' = view _Gadget+-- @+--+_Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))+_Gadget = _Wrapping Gadget . iso runReaderT ReaderT . iso (runStateT .) (StateT .)+{-# INLINABLE _Gadget #-}++-- | Non polymorphic version of _Gadget+_Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))+_Gadget' = _Gadget+{-# INLINABLE _Gadget' #-}++instance (Monad m, Semigroup c) => Semigroup (Gadget s m a c) where+ (Gadget f) <> (Gadget g) = Gadget $ (<>) <$> f <*> g+ {-# INLINABLE (<>) #-}++instance (Monad m, Monoid c) => Monoid (Gadget s m a c) where+ mempty = Gadget $ pure mempty+ {-# INLINABLE mempty #-}++ (Gadget f) `mappend` (Gadget g) = Gadget $ mappend <$> f <*> g+ {-# INLINABLE mappend #-}++instance Monad m => Profunctor (Gadget s m) where+ dimap f g (Gadget (ReaderT m)) = Gadget $ ReaderT $ \a -> StateT $ \s -> undefined+ (first g) <$> runStateT (m (f a)) s+ {-# INLINABLE dimap #-}++instance Monad m => Strong (Gadget s m) where+ first' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \(b, d) -> StateT $ \s ->+ (\(c, s') -> ((c, d), s')) <$> runStateT (bc b) s+ {-# INLINABLE first' #-}++instance Monad m => C.Category (Gadget s m) where+ id = Gadget $ ReaderT $ \a -> StateT $ \s -> pure (a, s)+ {-# INLINABLE id #-}++ Gadget (ReaderT bc) . Gadget (ReaderT ab) = Gadget $ ReaderT $ \a -> StateT $ \s -> do+ -- This line is the main difference between Strict and Lazy versions+ (b, s') <- runStateT (ab a) s+ runStateT (bc b) s'+ {-# INLINABLE (.) #-}++instance Monad m => Arrow (Gadget s m) where+ arr f = dimap f id C.id+ {-# INLINABLE arr #-}++ first = first'+ {-# INLINABLE first #-}++instance Monad m => Choice (Gadget s m) where+ left' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \db -> StateT $ \s -> case db of+ Left b -> do+ -- This line is the main difference between Strict and Lazy versions+ (c, s') <- runStateT (bc b) s+ pure (Left c, s')+ Right d -> pure (Right d, s)+ {-# INLINABLE left' #-}++instance Monad m => ArrowChoice (Gadget s m) where+ left = left'+ {-# INLINABLE left #-}++instance Monad m => ArrowApply (Gadget s m) where+ app = Gadget $ ReaderT $ \(Gadget (ReaderT bc), b) -> StateT $ \s -> runStateT (bc b) s+ {-# INLINABLE app #-}++instance MonadPlus m => ArrowZero (Gadget s m) where+ zeroArrow = Gadget mzero+ {-# INLINABLE zeroArrow #-}++instance MonadPlus m => ArrowPlus (Gadget s m) where+ Gadget a <+> Gadget b = Gadget (a `mplus` b)+ {-# INLINABLE (<+>) #-}++-- | zoom can be used to modify the state inside an Gadget+type instance Zoomed (Gadget s m a) = Zoomed (StateT s m)+instance Monad m => Zoom (Gadget s m a) (Gadget t m a) s t where+ zoom l = Gadget . zoom l . runGadget+ {-# INLINABLE zoom #-}++-- | magnify can be used to modify the action inside an Gadget+type instance Magnified (Gadget s m a) = Magnified (ReaderT a (StateT s m))+instance Monad m => Magnify (Gadget s m a) (Gadget s m b) a b where+ magnify l = Gadget . magnify l . runGadget+ {-# INLINABLE magnify #-}++type instance Implanted (Gadget s m a c) = Zoomed (Gadget s m a) c+instance Monad m => Implant (Gadget s m a c) (Gadget t m a c) s t where+ implant = zoom+ {-# INLINABLE implant #-}++type instance Dispatched (Gadget s m a c) = Magnified (Gadget s m a) c+instance Monad m => Dispatch (Gadget s m a c) (Gadget s m b c) a b where+ dispatch = magnify+ {-# INLINABLE dispatch #-}
− src/Glazier/Lazy.hs
@@ -1,350 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}--module Glazier.Lazy- ( Gadget(..)- , HasGadget(..)- , _Gadget- , _Gadget'- , hoistGadget- , Widget(..)- , _Widget- , _Widget'- , _WrappingWidget- , _WrappingWidget'- , hoistWidget- , statically- , dynamically- -- * Re-exports- , module Glazier- ) where--import Control.Applicative-import Control.Arrow-import qualified Control.Category as C-import Control.Lens-import qualified Control.Monad.Fail as Fail-import Control.Monad.Fix (MonadFix)-import Control.Monad.Morph-import Control.Monad.Reader-import Control.Monad.State.Strict-import Data.Functor.Apply-import Data.Maybe-import Data.Profunctor-import Data.Semigroup-import Glazier---- | The Elm update function is @a -> s -> (s, c)@--- This is isomorphic to @ReaderT a (State s) c@--- ie, given an action "a", and a current state "s", return the new state "s"--- and any commands "c" that need to be interpreted externally (eg. download file).--- This is named Gadget instead of Update to avoid confusion with update from Data.Map-newtype Gadget s m a c = Gadget- { runGadget :: ReaderT a (StateT s m) c- } deriving ( MonadState s- , MonadReader a- , Monad- , Applicative- , Functor- , Fail.MonadFail- , Alternative- , MonadPlus- , MonadFix- , MonadIO- )--class HasGadget s a | s -> a where- gadget :: Lens' s a--instance HasGadget (Gadget s m a c) (Gadget s m a c) where- gadget = id--makeWrapped ''Gadget---- | NB lift can be simulated:--- liftGadget :: (MonadTrans t, Monad m) => Gadget s m a c -> Gadget s (t m) a c--- liftGadget = _Wrapping Gadget %~ hoist (hoist lift)-hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c-hoistGadget g = _Wrapping Gadget %~ hoist (hoist g)---- | This Iso gives the following functions:------ @--- underGadget :: (ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c') -> Gadget s m a c -> Gadget s' m' a' c'--- underGadget f = _Wrapping Gadget %~ f------ overGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c'--- overGadget f = _Unwrapping Gadget %~ f------ belowGadget :: (a -> s -> m (c, s)) (a' -> s' -> m' (c', s')) -> Gadget s m a c -> Gadget s' m' a' c'--- belowGadget f = _Gadget %~ f------ aboveGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))--- aboveGadget f = from _Gadget %~ f------ mkGadget' :: (a -> s -> m (c, s)) -> Gadget s m a c--- mkGadget' = review _Gadget------ runGadget' :: Gadget s m a c -> (a -> s -> m (c, s))--- runGadget' = view _Gadget--- @----_Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))-_Gadget = _Wrapping Gadget . iso runReaderT ReaderT . iso (runStateT .) (StateT .)---- | Non polymorphic version of _Gadget-_Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))-_Gadget' = _Gadget--instance (Monad m, Semigroup c) => Semigroup (Gadget s m a c) where- (Gadget f) <> (Gadget g) = Gadget $ (<>) <$> f <*> g--instance (Monad m, Monoid c) => Monoid (Gadget s m a c) where- mempty = Gadget $ pure mempty- (Gadget f) `mappend` (Gadget g) = Gadget $ mappend <$> f <*> g--instance Monad m => Profunctor (Gadget s m) where- dimap f g (Gadget (ReaderT m)) = Gadget $ ReaderT $ \a -> StateT $ \s -> undefined- (first g) <$> runStateT (m (f a)) s--instance Monad m => Strong (Gadget s m) where- first' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \(b, d) -> StateT $ \s ->- (\(c, s') -> ((c, d), s')) <$> runStateT (bc b) s--instance Monad m => C.Category (Gadget s m) where- id = Gadget $ ReaderT $ \a -> StateT $ \s -> pure (a, s)- Gadget (ReaderT bc) . Gadget (ReaderT ab) = Gadget $ ReaderT $ \a -> StateT $ \s -> do- -- This line is the main difference between Strict and Lazy versions- ~(b, s') <- runStateT (ab a) s- runStateT (bc b) s'--instance Monad m => Arrow (Gadget s m) where- arr f = dimap f id C.id- first = first'--instance Monad m => Choice (Gadget s m) where- left' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \db -> StateT $ \s -> case db of- Left b -> do- -- This line is the main difference between Strict and Lazy versions- ~(c, s') <- runStateT (bc b) s- pure (Left c, s')- Right d -> pure (Right d, s)--instance Monad m => ArrowChoice (Gadget s m) where- left = left'--instance Monad m => ArrowApply (Gadget s m) where- app = Gadget $ ReaderT $ \(Gadget (ReaderT bc), b) -> StateT $ \s -> runStateT (bc b) s--instance MonadPlus m => ArrowZero (Gadget s m) where- zeroArrow = Gadget mzero--instance MonadPlus m => ArrowPlus (Gadget s m) where- Gadget a <+> Gadget b = Gadget (a `mplus` b)---- | zoom can be used to modify the state inside an Gadget-type instance Zoomed (Gadget s m a) = Zoomed (StateT s m)-instance Monad m => Zoom (Gadget s m a) (Gadget t m a) s t where- zoom l = Gadget . zoom l . runGadget- {-# INLINE zoom #-}---- | magnify can be used to modify the action inside an Gadget-type instance Magnified (Gadget s m a) = Magnified (ReaderT a (StateT s m))-instance Monad m => Magnify (Gadget s m a) (Gadget s m b) a b where- magnify l = Gadget . magnify l . runGadget- {-# INLINE magnify #-}--type instance Implanted (Gadget s m a c) = Zoomed (Gadget s m a) c-instance Monad m => Implant (Gadget s m a c) (Gadget t m a c) s t where- implant = zoom--type instance Dispatched (Gadget s m a c) = Magnified (Gadget s m a) c-instance Monad m => Dispatch (Gadget s m a c) (Gadget s m b c) a b where- dispatch = magnify----------------------------------------------------------------------------------- | A widget is basically a tuple with Gadget and Window.-data Widget s v m a c = Widget- { widgetWindow :: Window m s v- , widgetGadget :: Gadget s m a c- }--makeFields ''Widget---- | This Iso gives the following functions:------ @--- belowWidget :: ((s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))) -> Widget s v m a c -> Widget s' v' m' a' c'--- belowWidget f = _Widget %~ f------ aboveWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))--- aboveWidget f = from _Widget %~ f------ mkWidget' :: (s -> m v, a -> s -> m (c, s)) -> Widget s v m a c--- mkWidget' = review _Widget------ runWidget' :: Widget s v m a c -> (s -> m v, a -> s -> m (c, s))--- runWidget' = view _Widget--- @----_Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')- (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))-_Widget = iso (\(Widget w g) -> (view _Window w, view _Gadget g))- (\(w, g) -> Widget (review _Window w) (review _Gadget g))---- | This Iso gives the following functions:------ @--- underWidget :: ((Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')) -> Widget s v m a c -> Widget s' v' m' a' c'--- underWidget f = _WrappingWidget %~ f------ overWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')--- overWidget f = from _WrappingWidget %~ f------ mkWidget :: (Window m s v, Gadget s m a c) -> Widget s v m a c--- mkWidget = review _WrappingWidget------ runWidget :: Widget s v m a c -> (Window m s v, Gadget s m a c)--- runWidget = view _WrappingWidget--- @----_WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')- (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')-_WrappingWidget = iso (\(Widget w g) -> (w, g))- (\(w, g) -> Widget w g)---- | Non polymorphic version of _WrappingWidget-_WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)-_WrappingWidget' = _WrappingWidget---- | Non polymorphic version of _Widget-_Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))-_Widget' = _Widget---- | NB lift can be simulated:--- liftWidget :: (MonadTrans t, Monad m) => Widget s v m a c -> Widget s v (t m) a c--- liftWidget = hoistWidget lift-hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c--- hoistWidget f (Widget w g) = Widget (hoistWindow f w) (hoistGadget f g)-hoistWidget f = _WrappingWidget %~ \(w, g) -> (hoistWindow f w, hoistGadget f g)--instance (Monad m, Semigroup c, Semigroup v) => Semigroup (Widget s v m a c) where- w1 <> w2 = Widget- (widgetWindow w1 <> widgetWindow w2)- (widgetGadget w1 <> widgetGadget w2)--instance (Monad m, Monoid c, Monoid v) => Monoid (Widget s v m a c) where- mempty = Widget mempty mempty- mappend w1 w2 = Widget- (widgetWindow w1 `mappend` widgetWindow w2)- (widgetGadget w1 `mappend` widgetGadget w2)---- | Widget Functor is lawful--- 1: fmap id = id--- (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 m => Functor (Widget s v m a) where- fmap f (Widget w g) = Widget- w- (f <$> g)---- | Widget Applicative is lawful--- Identity: pure id <*> v = v--- Widget mempty (pure id) <*> Widget vw vg--- = Widget (mempty <> vw) (pure id <*> vg)--- = Widget vw vg--- Composition: pure (.) <*> u <*> v <*> w = u <*> (v <*> w)--- Widget mempty (pure (.)) <*> Widget uw ug <*> Widget vw vg <*> Widget ww wg =--- = Widget (mempty <> uw <> vw <> ww) (pure (.) <*> ug <*> vg <*> wg--- = Widget (uw <> vw <> ww) (ug <*> (vg <*> wg))--- = Widget (uw <> (vw <> ww)) (ug <*> (vg <*> wg))--- = Widget uw ug <*> (Widget vw vg <*> Widget ww wg)--- Interchange: u <*> pure y = pure ($ y) <*> u--- Widget uw ug <*> Widget mempty (pure y)--- = Widget (uw <> mempty) (ug <*> pure y)--- = Widget (mempty <> uw) (pure ($ y) <*> ug)--- = Widget mempty (pure $y) <*> Widget uw ug-instance (Semigroup v, Monad m, Monoid v) => Applicative (Widget s v m a) where- pure c = Widget mempty (pure c)- (Widget w1 fg) <*> (Widget w2 g) = Widget (w1 <> w2) (fg <*> g)--instance Monad m => Profunctor (Widget s v m) where- dimap f g (Widget w m) = Widget w (dimap f g m)--instance Monad m => Strong (Widget s v m) where- first' (Widget w g) = Widget w (first' g)--instance (Monad m, Monoid v) => C.Category (Widget s v m) where- id = Widget mempty C.id- Widget wbc gbc . Widget wab gab = Widget- (wab `mappend` wbc)- (gbc C.. gab)---- | No monad instance for Widget is possible, however an arrow is possible.--- The Arrow instance monoidally appends the Window, and uses the inner Gadget Arrow instance.-instance (Monad m, Monoid v) => Arrow (Widget s v m) where- arr f = dimap f id C.id- first = first'--instance (Monad m) => Choice (Widget s v m) where- left' (Widget w bc) = Widget w (left' bc)--instance (Monad m, Monoid v) => ArrowChoice (Widget s v m) where- left = left'--statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c-statically w = Widget w mempty--dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c-dynamically = Widget mempty--type instance Dispatched (Widget s v m a c) = Dispatched (Gadget s m a c)-instance Monad m => Dispatch (Widget s v m a c) (Widget s v m b c) a b where- dispatch p w = Widget- (widgetWindow w)- (dispatch p $ widgetGadget w)--type instance Implanted (Widget s v m a c) =- PairMaybeFunctor (Implanted (Gadget s m a c))- (Implanted (Window m s v))-instance Monad m => Implant (Widget s v m a c) (Widget t v m a c) s t where- implant l w = Widget- (implant (sndLensLike l) $ widgetWindow w)- (implant (fstLensLike l) $ widgetGadget w)---- ----------------------------------------------------------------------------------- | This can be used to hold two LensLike functors.--- The inner LensLike functor can be extracted from a @LensLike (PairMaybeFunctor f g) s t a b@--- using 'fstLensLike' or 'sndLensLike'.--- NB. The constructor must not be exported to keep 'fstLensLike' and 'sndLensLike' safe.-newtype PairMaybeFunctor f g a = PairMaybeFunctor { getPairMaybeFunctor :: (Maybe (f a), Maybe (g a)) }--instance (Functor f, Functor g) => Functor (PairMaybeFunctor f g) where- fmap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (fmap f <$> a, fmap f <$> b)--instance (Apply f, Apply g) => Apply (PairMaybeFunctor f g) where- (PairMaybeFunctor (a, b)) <.> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (Data.Functor.Apply.<.>) a c, liftA2 (Data.Functor.Apply.<.>) b d)--instance (Applicative f, Applicative g) => Applicative (PairMaybeFunctor f g) where- pure a = PairMaybeFunctor (Just $ pure a, Just $ pure a)- (PairMaybeFunctor (a, b)) <*> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (<*>) a c, liftA2 (<*>) b d)--instance (Contravariant f, Contravariant g) => Contravariant (PairMaybeFunctor f g) where- contramap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (contramap f <$> a, contramap f <$> b)--fstLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike f s t a b--- fromJust is safe here as the constructor is hidden and we've definitely filled in the fst item of PairMaybeFunctor-fstLensLike l f b = fromJust . fst . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Just $ f a, Nothing)) b--sndLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike g s t a b--- fromJust is safe here as the constructor is hidden and we've definitely filled in the snd item of PairMaybeFunctor-sndLensLike l f b = fromJust . snd . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Nothing, Just $ f a)) b
− src/Glazier/Strict.hs
@@ -1,350 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE UndecidableInstances #-}--module Glazier.Strict- ( Gadget(..)- , HasGadget(..)- , _Gadget- , _Gadget'- , hoistGadget- , Widget(..)- , _Widget- , _Widget'- , _WrappingWidget- , _WrappingWidget'- , hoistWidget- , statically- , dynamically- -- * Re-exports- , module Glazier- ) where--import Control.Applicative-import Control.Arrow-import qualified Control.Category as C-import Control.Lens-import qualified Control.Monad.Fail as Fail-import Control.Monad.Fix (MonadFix)-import Control.Monad.Morph-import Control.Monad.Reader-import Control.Monad.State.Strict-import Data.Functor.Apply-import Data.Maybe-import Data.Profunctor-import Data.Semigroup-import Glazier---- | The Elm update function is @a -> s -> (s, c)@--- This is isomorphic to @ReaderT a (State s) c@--- ie, given an action "a", and a current state "s", return the new state "s"--- and any commands "c" that need to be interpreted externally (eg. download file).--- This is named Gadget instead of Update to avoid confusion with update from Data.Map-newtype Gadget s m a c = Gadget- { runGadget :: ReaderT a (StateT s m) c- } deriving ( MonadState s- , MonadReader a- , Monad- , Applicative- , Functor- , Fail.MonadFail- , Alternative- , MonadPlus- , MonadFix- , MonadIO- )--class HasGadget s a | s -> a where- gadget :: Lens' s a--instance HasGadget (Gadget s m a c) (Gadget s m a c) where- gadget = id--makeWrapped ''Gadget---- | NB lift can be simulated:--- liftGadget :: (MonadTrans t, Monad m) => Gadget s m a c -> Gadget s (t m) a c--- liftGadget = _Wrapping Gadget %~ hoist (hoist lift)-hoistGadget :: (Monad m) => (forall b. m b -> n b) -> Gadget s m a c -> Gadget s n a c-hoistGadget g = _Wrapping Gadget %~ hoist (hoist g)---- | This Iso gives the following functions:------ @--- underGadget :: (ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c') -> Gadget s m a c -> Gadget s' m' a' c'--- underGadget f = _Wrapping Gadget %~ f------ overGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> ReaderT a (StateT s m) c -> ReaderT a' (StateT s' m') c'--- overGadget f = _Unwrapping Gadget %~ f------ belowGadget :: (a -> s -> m (c, s)) (a' -> s' -> m' (c', s')) -> Gadget s m a c -> Gadget s' m' a' c'--- belowGadget f = _Gadget %~ f------ aboveGadget :: (Gadget s m a c -> Gadget s' m' a' c') -> (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))--- aboveGadget f = from _Gadget %~ f------ mkGadget' :: (a -> s -> m (c, s)) -> Gadget s m a c--- mkGadget' = review _Gadget------ runGadget' :: Gadget s m a c -> (a -> s -> m (c, s))--- runGadget' = view _Gadget--- @----_Gadget :: Iso (Gadget s m a c) (Gadget s' m' a' c') (a -> s -> m (c, s)) (a' -> s' -> m' (c', s'))-_Gadget = _Wrapping Gadget . iso runReaderT ReaderT . iso (runStateT .) (StateT .)---- | Non polymorphic version of _Gadget-_Gadget' :: Iso' (Gadget s m a c) (a -> s -> m (c, s))-_Gadget' = _Gadget--instance (Monad m, Semigroup c) => Semigroup (Gadget s m a c) where- (Gadget f) <> (Gadget g) = Gadget $ (<>) <$> f <*> g--instance (Monad m, Monoid c) => Monoid (Gadget s m a c) where- mempty = Gadget $ pure mempty- (Gadget f) `mappend` (Gadget g) = Gadget $ mappend <$> f <*> g--instance Monad m => Profunctor (Gadget s m) where- dimap f g (Gadget (ReaderT m)) = Gadget $ ReaderT $ \a -> StateT $ \s -> undefined- (first g) <$> runStateT (m (f a)) s--instance Monad m => Strong (Gadget s m) where- first' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \(b, d) -> StateT $ \s ->- (\(c, s') -> ((c, d), s')) <$> runStateT (bc b) s--instance Monad m => C.Category (Gadget s m) where- id = Gadget $ ReaderT $ \a -> StateT $ \s -> pure (a, s)- Gadget (ReaderT bc) . Gadget (ReaderT ab) = Gadget $ ReaderT $ \a -> StateT $ \s -> do- -- This line is the main difference between Strict and Lazy versions- (b, s') <- runStateT (ab a) s- runStateT (bc b) s'--instance Monad m => Arrow (Gadget s m) where- arr f = dimap f id C.id- first = first'--instance Monad m => Choice (Gadget s m) where- left' (Gadget (ReaderT bc)) = Gadget $ ReaderT $ \db -> StateT $ \s -> case db of- Left b -> do- -- This line is the main difference between Strict and Lazy versions- (c, s') <- runStateT (bc b) s- pure (Left c, s')- Right d -> pure (Right d, s)--instance Monad m => ArrowChoice (Gadget s m) where- left = left'--instance Monad m => ArrowApply (Gadget s m) where- app = Gadget $ ReaderT $ \(Gadget (ReaderT bc), b) -> StateT $ \s -> runStateT (bc b) s--instance MonadPlus m => ArrowZero (Gadget s m) where- zeroArrow = Gadget mzero--instance MonadPlus m => ArrowPlus (Gadget s m) where- Gadget a <+> Gadget b = Gadget (a `mplus` b)---- | zoom can be used to modify the state inside an Gadget-type instance Zoomed (Gadget s m a) = Zoomed (StateT s m)-instance Monad m => Zoom (Gadget s m a) (Gadget t m a) s t where- zoom l = Gadget . zoom l . runGadget- {-# INLINE zoom #-}---- | magnify can be used to modify the action inside an Gadget-type instance Magnified (Gadget s m a) = Magnified (ReaderT a (StateT s m))-instance Monad m => Magnify (Gadget s m a) (Gadget s m b) a b where- magnify l = Gadget . magnify l . runGadget- {-# INLINE magnify #-}--type instance Implanted (Gadget s m a c) = Zoomed (Gadget s m a) c-instance Monad m => Implant (Gadget s m a c) (Gadget t m a c) s t where- implant = zoom--type instance Dispatched (Gadget s m a c) = Magnified (Gadget s m a) c-instance Monad m => Dispatch (Gadget s m a c) (Gadget s m b c) a b where- dispatch = magnify----------------------------------------------------------------------------------- | A widget is basically a tuple with Gadget and Window.-data Widget s v m a c = Widget- { widgetWindow :: Window m s v- , widgetGadget :: Gadget s m a c- }--makeFields ''Widget---- | This Iso gives the following functions:------ @--- belowWidget :: ((s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))) -> Widget s v m a c -> Widget s' v' m' a' c'--- belowWidget f = _Widget %~ f------ aboveWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))--- aboveWidget f = from _Widget %~ f------ mkWidget' :: (s -> m v, a -> s -> m (c, s)) -> Widget s v m a c--- mkWidget' = review _Widget------ runWidget' :: Widget s v m a c -> (s -> m v, a -> s -> m (c, s))--- runWidget' = view _Widget--- @----_Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')- (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))-_Widget = iso (\(Widget w g) -> (view _Window w, view _Gadget g))- (\(w, g) -> Widget (review _Window w) (review _Gadget g))---- | This Iso gives the following functions:------ @--- underWidget :: ((Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')) -> Widget s v m a c -> Widget s' v' m' a' c'--- underWidget f = _WrappingWidget %~ f------ overWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')--- overWidget f = from _WrappingWidget %~ f------ mkWidget :: (Window m s v, Gadget s m a c) -> Widget s v m a c--- mkWidget = review _WrappingWidget------ runWidget :: Widget s v m a c -> (Window m s v, Gadget s m a c)--- runWidget = view _WrappingWidget--- @----_WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')- (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')-_WrappingWidget = iso (\(Widget w g) -> (w, g))- (\(w, g) -> Widget w g)---- | Non polymorphic version of _WrappingWidget-_WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)-_WrappingWidget' = _WrappingWidget---- | Non polymorphic version of _Widget-_Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))-_Widget' = _Widget---- | NB lift can be simulated:--- liftWidget :: (MonadTrans t, Monad m) => Widget s v m a c -> Widget s v (t m) a c--- liftWidget = hoistWidget lift-hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c--- hoistWidget f (Widget w g) = Widget (hoistWindow f w) (hoistGadget f g)-hoistWidget f = _WrappingWidget %~ \(w, g) -> (hoistWindow f w, hoistGadget f g)--instance (Monad m, Semigroup c, Semigroup v) => Semigroup (Widget s v m a c) where- w1 <> w2 = Widget- (widgetWindow w1 <> widgetWindow w2)- (widgetGadget w1 <> widgetGadget w2)--instance (Monad m, Monoid c, Monoid v) => Monoid (Widget s v m a c) where- mempty = Widget mempty mempty- mappend w1 w2 = Widget- (widgetWindow w1 `mappend` widgetWindow w2)- (widgetGadget w1 `mappend` widgetGadget w2)---- | Widget Functor is lawful--- 1: fmap id = id--- (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 m => Functor (Widget s v m a) where- fmap f (Widget w g) = Widget- w- (f <$> g)---- | Widget Applicative is lawful--- Identity: pure id <*> v = v--- Widget mempty (pure id) <*> Widget vw vg--- = Widget (mempty <> vw) (pure id <*> vg)--- = Widget vw vg--- Composition: pure (.) <*> u <*> v <*> w = u <*> (v <*> w)--- Widget mempty (pure (.)) <*> Widget uw ug <*> Widget vw vg <*> Widget ww wg =--- = Widget (mempty <> uw <> vw <> ww) (pure (.) <*> ug <*> vg <*> wg--- = Widget (uw <> vw <> ww) (ug <*> (vg <*> wg))--- = Widget (uw <> (vw <> ww)) (ug <*> (vg <*> wg))--- = Widget uw ug <*> (Widget vw vg <*> Widget ww wg)--- Interchange: u <*> pure y = pure ($ y) <*> u--- Widget uw ug <*> Widget mempty (pure y)--- = Widget (uw <> mempty) (ug <*> pure y)--- = Widget (mempty <> uw) (pure ($ y) <*> ug)--- = Widget mempty (pure $y) <*> Widget uw ug-instance (Semigroup v, Monad m, Monoid v) => Applicative (Widget s v m a) where- pure c = Widget mempty (pure c)- (Widget w1 fg) <*> (Widget w2 g) = Widget (w1 <> w2) (fg <*> g)--instance Monad m => Profunctor (Widget s v m) where- dimap f g (Widget w m) = Widget w (dimap f g m)--instance Monad m => Strong (Widget s v m) where- first' (Widget w g) = Widget w (first' g)--instance (Monad m, Monoid v) => C.Category (Widget s v m) where- id = Widget mempty C.id- Widget wbc gbc . Widget wab gab = Widget- (wab `mappend` wbc)- (gbc C.. gab)---- | No monad instance for Widget is possible, however an arrow is possible.--- The Arrow instance monoidally appends the Window, and uses the inner Gadget Arrow instance.-instance (Monad m, Monoid v) => Arrow (Widget s v m) where- arr f = dimap f id C.id- first = first'--instance (Monad m) => Choice (Widget s v m) where- left' (Widget w bc) = Widget w (left' bc)--instance (Monad m, Monoid v) => ArrowChoice (Widget s v m) where- left = left'--statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c-statically w = Widget w mempty--dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c-dynamically = Widget mempty--type instance Dispatched (Widget s v m a c) = Dispatched (Gadget s m a c)-instance Monad m => Dispatch (Widget s v m a c) (Widget s v m b c) a b where- dispatch p w = Widget- (widgetWindow w)- (dispatch p $ widgetGadget w)--type instance Implanted (Widget s v m a c) =- PairMaybeFunctor (Implanted (Gadget s m a c))- (Implanted (Window m s v))-instance Monad m => Implant (Widget s v m a c) (Widget t v m a c) s t where- implant l w = Widget- (implant (sndLensLike l) $ widgetWindow w)- (implant (fstLensLike l) $ widgetGadget w)---- ----------------------------------------------------------------------------------- | This can be used to hold two LensLike functors.--- The inner LensLike functor can be extracted from a @LensLike (PairMaybeFunctor f g) s t a b@--- using 'fstLensLike' or 'sndLensLike'.--- NB. The constructor must not be exported to keep 'fstLensLike' and 'sndLensLike' safe.-newtype PairMaybeFunctor f g a = PairMaybeFunctor { getPairMaybeFunctor :: (Maybe (f a), Maybe (g a)) }--instance (Functor f, Functor g) => Functor (PairMaybeFunctor f g) where- fmap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (fmap f <$> a, fmap f <$> b)--instance (Apply f, Apply g) => Apply (PairMaybeFunctor f g) where- (PairMaybeFunctor (a, b)) <.> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (Data.Functor.Apply.<.>) a c, liftA2 (Data.Functor.Apply.<.>) b d)--instance (Applicative f, Applicative g) => Applicative (PairMaybeFunctor f g) where- pure a = PairMaybeFunctor (Just $ pure a, Just $ pure a)- (PairMaybeFunctor (a, b)) <*> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (<*>) a c, liftA2 (<*>) b d)--instance (Contravariant f, Contravariant g) => Contravariant (PairMaybeFunctor f g) where- contramap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (contramap f <$> a, contramap f <$> b)--fstLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike f s t a b--- fromJust is safe here as the constructor is hidden and we've definitely filled in the fst item of PairMaybeFunctor-fstLensLike l f b = fromJust . fst . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Just $ f a, Nothing)) b--sndLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike g s t a b--- fromJust is safe here as the constructor is hidden and we've definitely filled in the snd item of PairMaybeFunctor-sndLensLike l f b = fromJust . snd . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Nothing, Just $ f a)) b
+ src/Glazier/Widget/Lazy.hs view
@@ -0,0 +1,245 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++module Glazier.Widget.Lazy+ ( Widget(..)+ , _Widget+ , _Widget'+ , _WrappingWidget+ , _WrappingWidget'+ , hoistWidget+ , statically+ , dynamically+ ) where++import Control.Applicative+import Control.Arrow+import qualified Control.Category as C+import Control.Lens+import Data.Functor.Apply+import Data.Maybe+import Data.Profunctor+import Data.Semigroup+import Glazier.Class+import Glazier.Gadget.Lazy+import Glazier.Window++-- | A widget is basically a tuple with Gadget and Window.+data Widget s v m a c = Widget+ { widgetWindow :: Window m s v+ , widgetGadget :: Gadget s m a c+ }++makeFields ''Widget++-- | This Iso gives the following functions:+--+-- @+-- belowWidget :: ((s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))) -> Widget s v m a c -> Widget s' v' m' a' c'+-- belowWidget f = _Widget %~ f+--+-- aboveWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))+-- aboveWidget f = from _Widget %~ f+--+-- mkWidget' :: (s -> m v, a -> s -> m (c, s)) -> Widget s v m a c+-- mkWidget' = review _Widget+--+-- runWidget' :: Widget s v m a c -> (s -> m v, a -> s -> m (c, s))+-- runWidget' = view _Widget+-- @+--+_Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')+ (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))+_Widget = iso (\(Widget w g) -> (view _Window w, view _Gadget g))+ (\(w, g) -> Widget (review _Window w) (review _Gadget g))+{-# INLINABLE _Widget #-}++-- | This Iso gives the following functions:+--+-- @+-- underWidget :: ((Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')) -> Widget s v m a c -> Widget s' v' m' a' c'+-- underWidget f = _WrappingWidget %~ f+--+-- overWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')+-- overWidget f = from _WrappingWidget %~ f+--+-- mkWidget :: (Window m s v, Gadget s m a c) -> Widget s v m a c+-- mkWidget = review _WrappingWidget+--+-- runWidget :: Widget s v m a c -> (Window m s v, Gadget s m a c)+-- runWidget = view _WrappingWidget+-- @+--+_WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')+ (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')+_WrappingWidget = iso (\(Widget w g) -> (w, g))+ (\(w, g) -> Widget w g)+{-# INLINABLE _WrappingWidget #-}++-- | Non polymorphic version of _WrappingWidget+_WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)+_WrappingWidget' = _WrappingWidget+{-# INLINABLE _WrappingWidget' #-}++-- | Non polymorphic version of _Widget+_Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))+_Widget' = _Widget+{-# INLINABLE _Widget' #-}++-- | NB lift can be simulated:+-- liftWidget :: (MonadTrans t, Monad m) => Widget s v m a c -> Widget s v (t m) a c+-- liftWidget = hoistWidget lift+hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c+-- hoistWidget f (Widget w g) = Widget (hoistWindow f w) (hoistGadget f g)+hoistWidget f = _WrappingWidget %~ \(w, g) -> (hoistWindow f w, hoistGadget f g)+{-# INLINABLE hoistWidget #-}++instance (Monad m, Semigroup c, Semigroup v) => Semigroup (Widget s v m a c) where+ w1 <> w2 = Widget+ (widgetWindow w1 <> widgetWindow w2)+ (widgetGadget w1 <> widgetGadget w2)+ {-# INLINABLE (<>) #-}++instance (Monad m, Monoid c, Monoid v) => Monoid (Widget s v m a c) where+ mempty = Widget mempty mempty+ {-# INLINABLE mempty #-}++ mappend w1 w2 = Widget+ (widgetWindow w1 `mappend` widgetWindow w2)+ (widgetGadget w1 `mappend` widgetGadget w2)+ {-# INLINABLE mappend #-}++-- | Widget Functor is lawful+-- 1: fmap id = id+-- (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 m => Functor (Widget s v m a) where+ fmap f (Widget w g) = Widget+ w+ (f <$> g)+ {-# INLINABLE fmap #-}++-- | Widget Applicative is lawful+-- Identity: pure id <*> v = v+-- Widget mempty (pure id) <*> Widget vw vg+-- = Widget (mempty <> vw) (pure id <*> vg)+-- = Widget vw vg+-- Composition: pure (.) <*> u <*> v <*> w = u <*> (v <*> w)+-- Widget mempty (pure (.)) <*> Widget uw ug <*> Widget vw vg <*> Widget ww wg =+-- = Widget (mempty <> uw <> vw <> ww) (pure (.) <*> ug <*> vg <*> wg+-- = Widget (uw <> vw <> ww) (ug <*> (vg <*> wg))+-- = Widget (uw <> (vw <> ww)) (ug <*> (vg <*> wg))+-- = Widget uw ug <*> (Widget vw vg <*> Widget ww wg)+-- Interchange: u <*> pure y = pure ($ y) <*> u+-- Widget uw ug <*> Widget mempty (pure y)+-- = Widget (uw <> mempty) (ug <*> pure y)+-- = Widget (mempty <> uw) (pure ($ y) <*> ug)+-- = Widget mempty (pure $y) <*> Widget uw ug+instance (Semigroup v, Monad m, Monoid v) => Applicative (Widget s v m a) where+ pure c = Widget mempty (pure c)+ {-# INLINABLE pure #-}++ (Widget w1 fg) <*> (Widget w2 g) = Widget (w1 <> w2) (fg <*> g)+ {-# INLINABLE (<*>) #-}++instance Monad m => Profunctor (Widget s v m) where+ dimap f g (Widget w m) = Widget w (dimap f g m)+ {-# INLINABLE dimap #-}++instance Monad m => Strong (Widget s v m) where+ first' (Widget w g) = Widget w (first' g)+ {-# INLINABLE first' #-}++instance (Monad m, Monoid v) => C.Category (Widget s v m) where+ id = Widget mempty C.id+ {-# INLINABLE id #-}++ Widget wbc gbc . Widget wab gab = Widget+ (wab `mappend` wbc)+ (gbc C.. gab)+ {-# INLINABLE (.) #-}++-- | No monad instance for Widget is possible, however an arrow is possible.+-- The Arrow instance monoidally appends the Window, and uses the inner Gadget Arrow instance.+instance (Monad m, Monoid v) => Arrow (Widget s v m) where+ arr f = dimap f id C.id+ {-# INLINABLE arr #-}++ first = first'+ {-# INLINABLE first #-}++instance (Monad m) => Choice (Widget s v m) where+ left' (Widget w bc) = Widget w (left' bc)+ {-# INLINABLE left' #-}++instance (Monad m, Monoid v) => ArrowChoice (Widget s v m) where+ left = left'+ {-# INLINABLE left #-}++statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c+statically w = Widget w mempty+{-# INLINABLE statically #-}++dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c+dynamically = Widget mempty+{-# INLINABLE dynamically #-}++type instance Dispatched (Widget s v m a c) = Dispatched (Gadget s m a c)+instance Monad m => Dispatch (Widget s v m a c) (Widget s v m b c) a b where+ dispatch p w = Widget+ (widgetWindow w)+ (dispatch p $ widgetGadget w)+ {-# INLINABLE dispatch #-}++type instance Implanted (Widget s v m a c) =+ PairMaybeFunctor (Implanted (Gadget s m a c))+ (Implanted (Window m s v))+instance Monad m => Implant (Widget s v m a c) (Widget t v m a c) s t where+ implant l w = Widget+ (implant (sndLensLike l) $ widgetWindow w)+ (implant (fstLensLike l) $ widgetGadget w)+ {-# INLINABLE implant #-}++-- -------------------------------------------------------------------------------++-- | This can be used to hold two LensLike functors.+-- The inner LensLike functor can be extracted from a @LensLike (PairMaybeFunctor f g) s t a b@+-- using 'fstLensLike' or 'sndLensLike'.+-- NB. The constructor must not be exported to keep 'fstLensLike' and 'sndLensLike' safe.+newtype PairMaybeFunctor f g a = PairMaybeFunctor { getPairMaybeFunctor :: (Maybe (f a), Maybe (g a)) }++instance (Functor f, Functor g) => Functor (PairMaybeFunctor f g) where+ fmap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (fmap f <$> a, fmap f <$> b)+ {-# INLINABLE fmap #-}++instance (Apply f, Apply g) => Apply (PairMaybeFunctor f g) where+ (PairMaybeFunctor (a, b)) <.> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (Data.Functor.Apply.<.>) a c, liftA2 (Data.Functor.Apply.<.>) b d)+ {-# INLINABLE (<.>) #-}++instance (Applicative f, Applicative g) => Applicative (PairMaybeFunctor f g) where+ pure a = PairMaybeFunctor (Just $ pure a, Just $ pure a)+ {-# INLINABLE pure #-}++ (PairMaybeFunctor (a, b)) <*> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (<*>) a c, liftA2 (<*>) b d)+ {-# INLINABLE (<*>) #-}++instance (Contravariant f, Contravariant g) => Contravariant (PairMaybeFunctor f g) where+ contramap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (contramap f <$> a, contramap f <$> b)+ {-# INLINABLE contramap #-}++fstLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike f s t a b+-- fromJust is safe here as the constructor is hidden and we've definitely filled in the fst item of PairMaybeFunctor+fstLensLike l f b = fromJust . fst . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Just $ f a, Nothing)) b+{-# INLINABLE fstLensLike #-}++sndLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike g s t a b+-- fromJust is safe here as the constructor is hidden and we've definitely filled in the snd item of PairMaybeFunctor+sndLensLike l f b = fromJust . snd . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Nothing, Just $ f a)) b+{-# INLINABLE sndLensLike #-}
+ src/Glazier/Widget/Strict.hs view
@@ -0,0 +1,245 @@+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++module Glazier.Widget.Strict+ ( Widget(..)+ , _Widget+ , _Widget'+ , _WrappingWidget+ , _WrappingWidget'+ , hoistWidget+ , statically+ , dynamically+ ) where++import Control.Applicative+import Control.Arrow+import qualified Control.Category as C+import Control.Lens+import Data.Functor.Apply+import Data.Maybe+import Data.Profunctor+import Data.Semigroup+import Glazier.Class+import Glazier.Gadget.Strict+import Glazier.Window++-- | A widget is basically a tuple with Gadget and Window.+data Widget s v m a c = Widget+ { widgetWindow :: Window m s v+ , widgetGadget :: Gadget s m a c+ }++makeFields ''Widget++-- | This Iso gives the following functions:+--+-- @+-- belowWidget :: ((s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))) -> Widget s v m a c -> Widget s' v' m' a' c'+-- belowWidget f = _Widget %~ f+--+-- aboveWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (s -> m v, a -> s -> m (c, s)) -> (s' -> m' v', a' -> s' -> m' (c', s'))+-- aboveWidget f = from _Widget %~ f+--+-- mkWidget' :: (s -> m v, a -> s -> m (c, s)) -> Widget s v m a c+-- mkWidget' = review _Widget+--+-- runWidget' :: Widget s v m a c -> (s -> m v, a -> s -> m (c, s))+-- runWidget' = view _Widget+-- @+--+_Widget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')+ (s -> m v, a -> s -> m (c, s)) (s' -> m' v', a' -> s' -> m' (c', s'))+_Widget = iso (\(Widget w g) -> (view _Window w, view _Gadget g))+ (\(w, g) -> Widget (review _Window w) (review _Gadget g))+{-# INLINABLE _Widget #-}++-- | This Iso gives the following functions:+--+-- @+-- underWidget :: ((Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')) -> Widget s v m a c -> Widget s' v' m' a' c'+-- underWidget f = _WrappingWidget %~ f+--+-- overWidget :: (Widget s v m a c -> Widget s' v' m' a' c') -> (Window m s v, Gadget s m a c) -> (Window m' s' v', Gadget s' m' a' c')+-- overWidget f = from _WrappingWidget %~ f+--+-- mkWidget :: (Window m s v, Gadget s m a c) -> Widget s v m a c+-- mkWidget = review _WrappingWidget+--+-- runWidget :: Widget s v m a c -> (Window m s v, Gadget s m a c)+-- runWidget = view _WrappingWidget+-- @+--+_WrappingWidget :: Iso (Widget s v m a c) (Widget s' v' m' a' c')+ (Window m s v, Gadget s m a c) (Window m' s' v', Gadget s' m' a' c')+_WrappingWidget = iso (\(Widget w g) -> (w, g))+ (\(w, g) -> Widget w g)+{-# INLINABLE _WrappingWidget #-}++-- | Non polymorphic version of _WrappingWidget+_WrappingWidget' :: Iso' (Widget s v m a c) (Window m s v, Gadget s m a c)+_WrappingWidget' = _WrappingWidget+{-# INLINABLE _WrappingWidget' #-}++-- | Non polymorphic version of _Widget+_Widget' :: Iso' (Widget s v m a c) (s -> m v, a -> s -> m (c, s))+_Widget' = _Widget+{-# INLINABLE _Widget' #-}++-- | NB lift can be simulated:+-- liftWidget :: (MonadTrans t, Monad m) => Widget s v m a c -> Widget s v (t m) a c+-- liftWidget = hoistWidget lift+hoistWidget :: (Monad m) => (forall x. m x -> n x) -> Widget s v m a c -> Widget s v n a c+-- hoistWidget f (Widget w g) = Widget (hoistWindow f w) (hoistGadget f g)+hoistWidget f = _WrappingWidget %~ \(w, g) -> (hoistWindow f w, hoistGadget f g)+{-# INLINABLE hoistWidget #-}++instance (Monad m, Semigroup c, Semigroup v) => Semigroup (Widget s v m a c) where+ w1 <> w2 = Widget+ (widgetWindow w1 <> widgetWindow w2)+ (widgetGadget w1 <> widgetGadget w2)+ {-# INLINABLE (<>) #-}++instance (Monad m, Monoid c, Monoid v) => Monoid (Widget s v m a c) where+ mempty = Widget mempty mempty+ {-# INLINABLE mempty #-}++ mappend w1 w2 = Widget+ (widgetWindow w1 `mappend` widgetWindow w2)+ (widgetGadget w1 `mappend` widgetGadget w2)+ {-# INLINABLE mappend #-}++-- | Widget Functor is lawful+-- 1: fmap id = id+-- (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 m => Functor (Widget s v m a) where+ fmap f (Widget w g) = Widget+ w+ (f <$> g)+ {-# INLINABLE fmap #-}++-- | Widget Applicative is lawful+-- Identity: pure id <*> v = v+-- Widget mempty (pure id) <*> Widget vw vg+-- = Widget (mempty <> vw) (pure id <*> vg)+-- = Widget vw vg+-- Composition: pure (.) <*> u <*> v <*> w = u <*> (v <*> w)+-- Widget mempty (pure (.)) <*> Widget uw ug <*> Widget vw vg <*> Widget ww wg =+-- = Widget (mempty <> uw <> vw <> ww) (pure (.) <*> ug <*> vg <*> wg+-- = Widget (uw <> vw <> ww) (ug <*> (vg <*> wg))+-- = Widget (uw <> (vw <> ww)) (ug <*> (vg <*> wg))+-- = Widget uw ug <*> (Widget vw vg <*> Widget ww wg)+-- Interchange: u <*> pure y = pure ($ y) <*> u+-- Widget uw ug <*> Widget mempty (pure y)+-- = Widget (uw <> mempty) (ug <*> pure y)+-- = Widget (mempty <> uw) (pure ($ y) <*> ug)+-- = Widget mempty (pure $y) <*> Widget uw ug+instance (Semigroup v, Monad m, Monoid v) => Applicative (Widget s v m a) where+ pure c = Widget mempty (pure c)+ {-# INLINABLE pure #-}++ (Widget w1 fg) <*> (Widget w2 g) = Widget (w1 <> w2) (fg <*> g)+ {-# INLINABLE (<*>) #-}++instance Monad m => Profunctor (Widget s v m) where+ dimap f g (Widget w m) = Widget w (dimap f g m)+ {-# INLINABLE dimap #-}++instance Monad m => Strong (Widget s v m) where+ first' (Widget w g) = Widget w (first' g)+ {-# INLINABLE first' #-}++instance (Monad m, Monoid v) => C.Category (Widget s v m) where+ id = Widget mempty C.id+ {-# INLINABLE id #-}++ Widget wbc gbc . Widget wab gab = Widget+ (wab `mappend` wbc)+ (gbc C.. gab)+ {-# INLINABLE (.) #-}++-- | No monad instance for Widget is possible, however an arrow is possible.+-- The Arrow instance monoidally appends the Window, and uses the inner Gadget Arrow instance.+instance (Monad m, Monoid v) => Arrow (Widget s v m) where+ arr f = dimap f id C.id+ {-# INLINABLE arr #-}++ first = first'+ {-# INLINABLE first #-}++instance (Monad m) => Choice (Widget s v m) where+ left' (Widget w bc) = Widget w (left' bc)+ {-# INLINABLE left' #-}++instance (Monad m, Monoid v) => ArrowChoice (Widget s v m) where+ left = left'+ {-# INLINABLE left #-}++statically :: (Monad m, Monoid c) => Window m s v -> Widget s v m a c+statically w = Widget w mempty+{-# INLINABLE statically #-}++dynamically :: (Monad m, Monoid v) => Gadget s m a c -> Widget s v m a c+dynamically = Widget mempty+{-# INLINABLE dynamically #-}++type instance Dispatched (Widget s v m a c) = Dispatched (Gadget s m a c)+instance Monad m => Dispatch (Widget s v m a c) (Widget s v m b c) a b where+ dispatch p w = Widget+ (widgetWindow w)+ (dispatch p $ widgetGadget w)+ {-# INLINABLE dispatch #-}++type instance Implanted (Widget s v m a c) =+ PairMaybeFunctor (Implanted (Gadget s m a c))+ (Implanted (Window m s v))+instance Monad m => Implant (Widget s v m a c) (Widget t v m a c) s t where+ implant l w = Widget+ (implant (sndLensLike l) $ widgetWindow w)+ (implant (fstLensLike l) $ widgetGadget w)+ {-# INLINABLE implant #-}++-- -------------------------------------------------------------------------------++-- | This can be used to hold two LensLike functors.+-- The inner LensLike functor can be extracted from a @LensLike (PairMaybeFunctor f g) s t a b@+-- using 'fstLensLike' or 'sndLensLike'.+-- NB. The constructor must not be exported to keep 'fstLensLike' and 'sndLensLike' safe.+newtype PairMaybeFunctor f g a = PairMaybeFunctor { getPairMaybeFunctor :: (Maybe (f a), Maybe (g a)) }++instance (Functor f, Functor g) => Functor (PairMaybeFunctor f g) where+ fmap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (fmap f <$> a, fmap f <$> b)+ {-# INLINABLE fmap #-}++instance (Apply f, Apply g) => Apply (PairMaybeFunctor f g) where+ (PairMaybeFunctor (a, b)) <.> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (Data.Functor.Apply.<.>) a c, liftA2 (Data.Functor.Apply.<.>) b d)+ {-# INLINABLE (<.>) #-}++instance (Applicative f, Applicative g) => Applicative (PairMaybeFunctor f g) where+ pure a = PairMaybeFunctor (Just $ pure a, Just $ pure a)+ {-# INLINABLE pure #-}++ (PairMaybeFunctor (a, b)) <*> (PairMaybeFunctor (c, d)) = PairMaybeFunctor (liftA2 (<*>) a c, liftA2 (<*>) b d)+ {-# INLINABLE (<*>) #-}++instance (Contravariant f, Contravariant g) => Contravariant (PairMaybeFunctor f g) where+ contramap f (PairMaybeFunctor (a, b)) = PairMaybeFunctor (contramap f <$> a, contramap f <$> b)+ {-# INLINABLE contramap #-}++fstLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike f s t a b+-- fromJust is safe here as the constructor is hidden and we've definitely filled in the fst item of PairMaybeFunctor+fstLensLike l f b = fromJust . fst . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Just $ f a, Nothing)) b+{-# INLINABLE fstLensLike #-}++sndLensLike :: LensLike (PairMaybeFunctor f g) s t a b -> LensLike g s t a b+-- fromJust is safe here as the constructor is hidden and we've definitely filled in the snd item of PairMaybeFunctor+sndLensLike l f b = fromJust . snd . getPairMaybeFunctor $ l (\a -> PairMaybeFunctor (Nothing, Just $ f a)) b+{-# INLINABLE sndLensLike #-}
+ src/Glazier/Window.hs view
@@ -0,0 +1,184 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-}++-- | Functional version of (Elm View/Update & startApp architecture) enabling composable widgets, and a FRP-like framework.+--+-- This framework makes it easier to modularize the Elm architecture idea of View/Update:+-- based on the deprecated Elm Architecture version of Jan 2016+-- https://github.com/evancz/elm-architecture-tutorial/tree/de5682a5a8e4459aed4637533adb25e462f8a2ae+--+-- The Elm View/Update is basically as follows:+--+-- @+-- data Model = Blah....+-- data Action = DoThis | DoThat deriving Show+--+-- -- | update is fired from an event processing loop+-- update :: Action -> Model -> Model+--+-- -- | The widget from 'view' knows how to send Action to a mailbox+-- view :: Signal Address -> Model -> Html+-- @+--+-- This module uses isomorphic Window and Gadget resulting in instances can be be composed together into larger Widgets.+-- Original inspiration from https://arianvp.me/lenses-and-prisms-for-modular-clientside-apps/+--+-- This framework provides three main combinators:+-- * Semigroup and Monoid instances for concatenating widgets.+-- * 'dispatch' is used to re-route the action type.+-- * 'implant' is used to modify the model type.+module Glazier.Window where++import Control.Applicative+import Control.Arrow+import qualified Control.Category as C+import Control.Lens+import qualified Control.Lens.Internal.Zoom as Z+import qualified Control.Monad.Fail as Fail+import Control.Monad.Fix (MonadFix)+import Control.Monad.Morph+import Control.Monad.Reader+import Control.Monad.Zip (MonadZip)+import Data.Profunctor+import Data.Semigroup+import Glazier.Class++-------------------------------------------------------------------------------++-- | The Elm view function is basically @view :: model -> html@+-- NB. elm-html is actually @view :: Signal.Address action -> model -> html@+-- where @Signal.Address action@ is the Pipes.Concurrent.Output that is sent+-- actions (eg. when html button is clicked).+-- This address argument is not required in the general case, and is only required for specific widgets on an as needed basis.+-- Therefore, using the fundamental type of @view :: model -> html@+-- This is be ehanced with monadic effects with ReaderT.+-- This is named Window instead of View to avoid confusion with view from Control.Lens+newtype Window m s v = Window+ { runWindow :: ReaderT s m v+ } deriving ( MonadReader s+ , Monad+ , Applicative+ , Functor+ , Fail.MonadFail+ , Alternative+ , MonadPlus+ , MonadFix+ , MonadIO+ , MonadZip+ )+class HasWindow s a | s -> a where+ window :: Lens' s a++instance HasWindow (Window m s v) (Window m s v) where+ window = id++makeWrapped ''Window++-- | NB lift can be simulated:+-- liftWindow :: (MonadTrans t, Monad m) => Window m s v -> Window (t m) s v+-- liftWindow = hoistWindow lift+hoistWindow :: (Monad m) => (forall a. m a -> n a) -> Window m s v -> Window n s v+hoistWindow g = _Wrapping Window %~ hoist g+{-# INLINABLE hoistWindow #-}++-- | This Iso gives the following functions:+--+-- @+-- liftWindow :: (MonadTrans t, Monad m) => Window m s v -> Window (t m) s v+-- liftWindow = hoistWindow lift+--+-- underWindow :: (ReaderT s m v -> ReaderT s' m' v') -> Window m s v -> Window m' s' v'+-- underWindow f = _Wrapping Window %~ f+--+-- overWindow :: (Window m s v -> Window m' s' v') -> ReaderT s m v -> ReaderT s' m' v'+-- overWindow f = _Unwrapping Window %~ f+--+-- belowWindow :: ((s -> m v) -> (s' -> m' v')) -> Window m s v -> Window m' s' v'+-- belowWindow f = _Window %~ f+--+-- aboveWindow :: (Window m s v -> Window m' s' v') -> (s -> m v) -> (s' -> m' v')+-- aboveWindow f = from _Window %~ f+--+-- mkWindow' :: (s -> m v) -> Window m s v+-- mkWindow' = review _Window+--+-- runWindow' :: Window m s v -> (s -> m v)+-- runWindow' = view _Window+-- @+--+_Window :: Iso (Window m s v) (Window m' s' v') (s -> m v) (s' -> m' v')+_Window = _Wrapping Window . iso runReaderT ReaderT -- lens 4.15.1 doesn't have a general enough ReaderT iso+{-# INLINABLE _Window #-}++-- | Non polymorphic version of _Window+_Window' :: Iso' (Window m s v) (s -> m v)+_Window' = _Window+{-# INLINABLE _Window' #-}++instance (Applicative m, Semigroup v) => Semigroup (Window m s v) where+ (Window f) <> (Window g) = Window $ ReaderT $ \a ->+ (<>) <$> runReaderT f a <*> runReaderT g a+ {-# INLINABLE (<>) #-}++instance (Applicative m, Monoid v) => Monoid (Window m s v) where+ mempty = Window $ ReaderT $ const $ pure mempty+ {-# INLINABLE mempty #-}++ (Window f) `mappend` (Window g) = Window $ ReaderT $ \a ->+ mappend <$> runReaderT f a <*> runReaderT g a+ {-# INLINABLE mappend #-}++instance Monad m => Profunctor (Window m) where+ dimap f g = _Window %~ (runKleisli . dimap f g . Kleisli)+ {-# INLINABLE dimap #-}++instance Monad m => Strong (Window m) where+ first' = _Window %~ (runKleisli . first' . Kleisli)+ {-# INLINABLE first' #-}++instance Monad m => C.Category (Window m) where+ id = Window . ReaderT $ runKleisli C.id+ {-# INLINABLE id #-}++ Window (ReaderT k) . Window (ReaderT l) = Window . ReaderT . runKleisli $ Kleisli k C.. Kleisli l+ {-# INLINABLE (.) #-}++instance Monad m => Arrow (Window m) where+ arr f = Window $ ReaderT $ runKleisli $ arr f+ {-# INLINABLE arr #-}++ first = _Window %~ (runKleisli . first . Kleisli)+ {-# INLINABLE first #-}++instance Monad m => Choice (Window m) where+ left' = _Window %~ (runKleisli . left' . Kleisli)+ {-# INLINABLE left' #-}++instance Monad m => ArrowChoice (Window m) where+ left = _Window %~ (runKleisli . left . Kleisli)+ {-# INLINABLE left #-}++instance Monad m => ArrowApply (Window m) where+ app = Window . ReaderT $ \(Window (ReaderT bc), b) -> bc b+ {-# INLINABLE app #-}++instance MonadPlus m => ArrowZero (Window m) where+ zeroArrow = Window mzero+ {-# INLINABLE zeroArrow #-}++instance MonadPlus m => ArrowPlus (Window m) where+ Window a <+> Window b = Window (a `mplus` b)+ {-# INLINABLE (<+>) #-}++type instance Implanted (Window m s v) = Z.Effect m v+instance Monad m => Implant (Window m s v) (Window m t v) s t where+ implant l (Window m) = Window $ magnify l m+ {-# INLINABLE implant #-}