glazier-0.9.0.0: Composable widgets framework

Safe HaskellNone
LanguageHaskell2010

Glazier.Window

Description

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.

Synopsis

Documentation

newtype WindowT s v m r Source #

The Elm view function is basically view :: model -> html This is be ehanced with monadic effects with ReaderT. The render output can be wrapped in a WriterT to make it more composable. We use a CPS-style WriterT (ie a StateT) to avoid space leaks. This is named Window instead of View to avoid confusion with view from Control.Lens NB. This is the same formulation as GadgetT. The only difference is WindowT only has Implant instance.

Constructors

WindowT 

Fields

Instances

Monad m => MonadState v (WindowT s v m) Source # 

Methods

get :: WindowT s v m v #

put :: v -> WindowT s v m () #

state :: (v -> (a, v)) -> WindowT s v m a #

Monad m => MonadReader s (WindowT s v m) Source # 

Methods

ask :: WindowT s v m s #

local :: (s -> s) -> WindowT s v m a -> WindowT s v m a #

reader :: (s -> a) -> WindowT s v m a #

MFunctor (WindowT s v) Source # 

Methods

hoist :: Monad m => (forall a. m a -> n a) -> WindowT s v m b -> WindowT s v n b #

MonadTrans (WindowT s v) Source # 

Methods

lift :: Monad m => m a -> WindowT s v m a #

Monad m => Monad (WindowT s v m) Source # 

Methods

(>>=) :: WindowT s v m a -> (a -> WindowT s v m b) -> WindowT s v m b #

(>>) :: WindowT s v m a -> WindowT s v m b -> WindowT s v m b #

return :: a -> WindowT s v m a #

fail :: String -> WindowT s v m a #

Functor m => Functor (WindowT s v m) Source # 

Methods

fmap :: (a -> b) -> WindowT s v m a -> WindowT s v m b #

(<$) :: a -> WindowT s v m b -> WindowT s v m a #

MonadFix m => MonadFix (WindowT s v m) Source # 

Methods

mfix :: (a -> WindowT s v m a) -> WindowT s v m a #

MonadFail m => MonadFail (WindowT s v m) Source # 

Methods

fail :: String -> WindowT s v m a #

Monad m => Applicative (WindowT s v m) Source # 

Methods

pure :: a -> WindowT s v m a #

(<*>) :: WindowT s v m (a -> b) -> WindowT s v m a -> WindowT s v m b #

(*>) :: WindowT s v m a -> WindowT s v m b -> WindowT s v m b #

(<*) :: WindowT s v m a -> WindowT s v m b -> WindowT s v m a #

MonadIO m => MonadIO (WindowT s v m) Source # 

Methods

liftIO :: IO a -> WindowT s v m a #

MonadPlus m => Alternative (WindowT s v m) Source # 

Methods

empty :: WindowT s v m a #

(<|>) :: WindowT s v m a -> WindowT s v m a -> WindowT s v m a #

some :: WindowT s v m a -> WindowT s v m [a] #

many :: WindowT s v m a -> WindowT s v m [a] #

MonadPlus m => MonadPlus (WindowT s v m) Source # 

Methods

mzero :: WindowT s v m a #

mplus :: WindowT s v m a -> WindowT s v m a -> WindowT s v m a #

Monad m => Zoom (WindowT s v m) (WindowT s u m) v u Source # 

Methods

zoom :: LensLike' (Zoomed (WindowT s v m) c) u v -> WindowT s v m c -> WindowT s u m c #

Monad m => Magnify (WindowT s v m) (WindowT t v m) s t Source # 

Methods

magnify :: LensLike' (Magnified (WindowT s v m) c) t s -> WindowT s v m c -> WindowT t v m c #

(Monad m, Semigroup r) => Semigroup (WindowT s v m r) Source # 

Methods

(<>) :: WindowT s v m r -> WindowT s v m r -> WindowT s v m r #

sconcat :: NonEmpty (WindowT s v m r) -> WindowT s v m r #

stimes :: Integral b => b -> WindowT s v m r -> WindowT s v m r #

(Monad m, Monoid r) => Monoid (WindowT s v m r) Source # 

Methods

mempty :: WindowT s v m r #

mappend :: WindowT s v m r -> WindowT s v m r -> WindowT s v m r #

mconcat :: [WindowT s v m r] -> WindowT s v m r #

Wrapped (WindowT s0 v0 m0 r0) Source # 

Associated Types

type Unwrapped (WindowT s0 v0 m0 r0) :: * #

Methods

_Wrapped' :: Iso' (WindowT s0 v0 m0 r0) (Unwrapped (WindowT s0 v0 m0 r0)) #

(~) * (WindowT s0 v0 m0 r0) t0 => Rewrapped (WindowT s1 v1 m1 r1) t0 Source # 
Monad m => Implant (WindowT s v m r) (WindowT t v m r) s t Source # 

Methods

implant :: LensLike' (Implanted (WindowT s v m r)) t s -> WindowT s v m r -> WindowT t v m r Source #

type Zoomed (WindowT s v m) Source # 
type Zoomed (WindowT s v m) = Zoomed (ReaderT * s (StateT v m))
type Magnified (WindowT s v m) Source # 
type Magnified (WindowT s v m) = Magnified (ReaderT * s (StateT v m))
type Unwrapped (WindowT s0 v0 m0 r0) Source # 
type Unwrapped (WindowT s0 v0 m0 r0) = ReaderT * s0 (StateT v0 m0) r0
type Implanted (WindowT s v m r) Source # 
type Implanted (WindowT s v m r) = Magnified (WindowT s v m) r

type Window s v = WindowT s v Identity Source #

_WindowT :: Iso (WindowT s v m r) (WindowT s' v' m' r') (s -> v -> m (r, v)) (s' -> v' -> m' (r', v')) Source #

_WindowT' :: Iso' (WindowT s v m r) (s -> v -> m (r, v)) Source #

Non polymorphic version of _Window

mkWindowT' :: (s -> v -> m (r, v)) -> WindowT s v m r Source #

runWindowT' :: WindowT s v m r -> s -> v -> m (r, v) Source #

belowWindowT :: ((s -> v -> m (r, v)) -> s' -> v' -> m' (r', v')) -> WindowT s v m r -> WindowT s' v' m' r' Source #

underWindowT :: (ReaderT s (StateT v m) r -> ReaderT s' (StateT v' m') r') -> WindowT s v m r -> WindowT s' v' m' r' Source #

overWindowT :: (WindowT s v m r -> WindowT s' v' m' r') -> ReaderT s (StateT v m) r -> ReaderT s' (StateT v' m') r' Source #

aboveWindowT :: (WindowT s v m r -> WindowT s' v' m' r') -> (s -> v -> m (r, v)) -> s' -> v' -> m' (r', v') Source #