module FRP.Helm.Sample ( Sample(..), value, update ) where import Control.Applicative data Sample a = Changed a | Unchanged a deriving (Show, Eq) instance Functor Sample where fmap = liftA instance Applicative Sample where pure = Unchanged (Changed f) <*> (Changed x) = Changed (f x) (Changed f) <*> (Unchanged x) = Changed (f x) (Unchanged f) <*> (Changed x) = Changed (f x) (Unchanged f) <*> (Unchanged x) = Unchanged (f x) value :: Sample a -> a value (Changed x) = x value (Unchanged x) = x update :: Eq a => p -> a -> Sample a -> Sample a update _ new old = if new == value old then Unchanged $ value old else Changed new