Description

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 #