@@ -13,7 +13,7 @@ import Data.Array as A
1313import Data.Either (Either (..))
1414import Data.Foldable (fold )
1515import Data.Function (identity , ($), (<<<))
16- import Data.Functor (class Functor , void , ($>))
16+ import Data.Functor (class Functor , void , ($>), map )
1717import Data.Maybe (Maybe (..))
1818import Data.Monoid (class Monoid , mempty )
1919import Data.Newtype (class Newtype )
@@ -26,15 +26,28 @@ import Effect.Ref as Ref
2626
2727-- | Callback -> Effect Canceler (returns the unused effect)
2828newtype Callback a = Callback (Callback' a )
29+
30+ derive instance Newtype (Callback a ) _
31+
2932type Callback' a = (a -> Effect Unit ) -> Effect Canceler
3033type Canceler = Effect Unit
3134
3235data Result v a = View v | Completed a
3336
37+ result :: forall v a r . (v -> r ) -> (a -> r ) -> Result v a -> r
38+ result f g = case _ of
39+ View v -> f v
40+ Completed a -> g a
41+
3442instance functorResult :: Functor (Result v ) where
3543 map _ (View v) = View v
3644 map f (Completed a) = Completed (f a)
3745
46+ mapViewResult :: forall u v a . (u -> v ) -> Result u a -> Result v a
47+ mapViewResult f = case _ of
48+ View u -> View (f u)
49+ Completed a -> Completed a
50+
3851mkCallback :: forall a . Callback' a -> Callback a
3952mkCallback = Callback
4053
@@ -57,9 +70,9 @@ instance widgetShiftMap :: ShiftMap (Widget v) (Widget v) where
5770-- A Widget is basically a callback that returns a view or a return value
5871newtype Widget v a = Widget (Callback (Result v a ))
5972
60- derive instance functorWidget :: Functor (Widget v )
73+ derive instance Functor (Widget v )
6174
62- instance newtypeWidget :: Newtype (Widget v a ) ( Callback ( Result v a ))
75+ derive instance Newtype (Widget v a ) _
6376
6477unWid :: forall v a . Widget v a -> Callback (Result v a )
6578unWid (Widget w) = w
@@ -70,6 +83,9 @@ runWidget (Widget (Callback e)) = e
7083mkWidget :: forall v a . Callback' (Result v a ) -> Widget v a
7184mkWidget e = Widget (Callback e)
7285
86+ mapView :: forall u v a . (u -> v ) -> Widget u a -> Widget v a
87+ mapView f (Widget w) = Widget (map (mapViewResult f) w)
88+
7389instance applyWidget :: Apply (Widget v ) where
7490 apply = ap
7591
0 commit comments