Safe Haskell | None |
---|---|

Language | Haskell2010 |

Lens combinators for Shpadoinkle applications.

## Synopsis

- generalize :: forall f m s a. Functor m => Continuous f => Lens' s a -> f m a -> f m s
- onSum :: forall f m s a. Applicative m => Continuous f => Traversal' s a -> f m a -> f m s
- onRecord :: forall f m s a. Functor m => Continuous f => Lens' s a -> f m a -> f m s
- onRecordEndo :: forall f m s a. Functor m => Continuous f => Lens' s a -> (a -> f m a) -> s -> f m s
- mapLens :: forall f m s a. Functor m => Continuous f => (a -> f m a) -> s -> Lens' s a -> f m s
- (%>) :: forall f m s a. Functor m => Continuous f => (a -> f m a) -> s -> Lens' s a -> f m s
- forLens :: forall f m s a. Functor m => Continuous f => s -> Lens' s a -> (a -> f m a) -> f m s
- (<%) :: forall f m s a. Functor m => Continuous f => s -> Lens' s a -> (a -> f m a) -> f m s
- rounding :: forall a s. Integral s => RealFrac a => Iso' s a
- defaulting :: a -> Iso' (Maybe a) a
- fracIntegral :: forall s a. Integral a => RealFrac s => Prism' s a

# 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 `Int`

s, 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 `Int`

s 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 `Int`

s. 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

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