Shpadoinkle-lens-0.0.0.3: Lens combinators for Shpadoinkle applications.

Safe HaskellNone
LanguageHaskell2010

Shpadoinkle.Lens

Contents

Description

Lens combinators for Shpadoinkle applications.

Synopsis

Continuous Composition

generalize :: forall f m s a. Functor m => Continuous f => Lens' s a -> f m a -> f m s Source #

Compose multiple Shpadoinkle views onto a product type, most frequently a record. Let's say we have Html which produces Ints, and we need to use it in a view with more components. The model for such a view might be (Int, String). To use our child Html inside the parent, we can assign produced Ints to the parent tuple by using the _1 lens like so:

 child :: Html Int

 parent :: Html (Int, String)
 parent = div_
   [ button [ onClick (0, "Reset") [ text "Reset!" ]
   , generalize _1 child
   ]
 

onSum :: forall f m s a. Applicative m => Continuous f => Traversal' s a -> f m a -> f m s Source #

Split multiple Shpadoinkle views over a sum type. This is commonly the case when using a sum to represent pages in a single page application, but it's useful for any sum. For example, consider that you have a view with a model of Either Int String and a child Html that produces Ints. You can compose this child onto the parent using _Left traversal like so:

 child :: Html Int

 parent :: Html (Either Int String)
 parent = div_
   [ button [ onClick (Right "Reset") ] [ text "Reset!" ]
   , onSum _Left child
   ]
 

onRecord :: forall f m s a. Functor m => Continuous f => Lens' s a -> f m a -> f m s Source #

Alias for generalize with a name idiomatic to the common case of composing onto a record.

onRecordEndo :: forall f m s a. Functor m => Continuous f => Lens' s a -> (a -> f m a) -> s -> f m s Source #

mapLens :: forall f m s a. Functor m => Continuous f => (a -> f m a) -> s -> Lens' s a -> f m s Source #

Like forLens but with the lambda as the first argument.

(%>) :: forall f m s a. Functor m => Continuous f => (a -> f m a) -> s -> Lens' s a -> f m s infixr 8 Source #

Infix for mapLens

forLens :: forall f m s a. Functor m => Continuous f => s -> Lens' s a -> (a -> f m a) -> f m s Source #

A variant of generalize for the case where you might need to map the smaller value.

  parent :: Html (Int, String)
  parent model = div_
   [ forLens model _1 $ (i :: Int) ->
       if i < 10 then text "too low" else
         button [ onClick (i + 1) ] [ text "Increment" ]
   ]
  

(<%) :: forall f m s a. Functor m => Continuous f => s -> Lens' s a -> (a -> f m a) -> f m s infixl 8 Source #

Infix for forLens

Misc Outlaws

rounding :: forall a s. Integral s => RealFrac a => Iso' s a Source #

defaulting :: a -> Iso' (Maybe a) a Source #

fracIntegral :: forall s a. Integral a => RealFrac s => Prism' s a Source #