reflex-vty-0.1.4.0: src/Reflex/Class/Switchable.hs
{-|
Module: Reflex.Class.Switchable
Description: A class for things that can be switched on the firing of an event
-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE UndecidableInstances #-}
module Reflex.Class.Switchable where
import Control.Monad
import Reflex
-- | Class representing things that can be switched when the provided event occurs
class Reflex t => Switchable t w | w -> t where
switching :: MonadHold t m => w -> Event t w -> m w
instance Reflex t => Switchable t (Event t a) where
switching = switchHold
instance Reflex t => Switchable t (Dynamic t a) where
switching a e = fmap join $ holdDyn a e
instance Reflex t => Switchable t (Behavior t a) where
switching = switcher
instance (Reflex t, Switchable t a, Switchable t b) => Switchable t (a, b) where
switching (a, b) e = (,)
<$> switching a (fmap fst e)
<*> switching b (fmap snd e)