{-| A Grapefruit example which demonstrates the use of feedback loops. A button with one star is shown. Each time, the user clicks on the button, one star is added to the caption of the button. The interesting thing about this is that the button’s input depends on the button’s output. So you need the 'ArrowLoop' instance of 'UICircuit'. -} module Examples.Grapefruit.Simple ( mainCircuit ) where -- Control import Control.Applicative as Applicative import Control.Arrow as Arrow -- Data import Data.Record as Record -- FRP.Grapefruit import FRP.Grapefruit.Signal.Discrete as DSignal import FRP.Grapefruit.Signal.Segmented as SSignal -- Graphics.UI.Grapefruit import Graphics.UI.Grapefruit.Item as UIItem import Graphics.UI.Grapefruit.Circuit as UICircuit import Graphics.UI.Grapefruit.Backend.Basic as BasicUIBackend -- |The circuit describing the whole application. mainCircuit :: (BasicUIBackend uiBackend) => UICircuit Window uiBackend era () (DSignal era ()) mainCircuit = proc () -> do rec let title = pure "Simple" text = SSignal.scan "*" (const . ('*' :)) push X :& Closure := closure `With` X :& Push := push <- window `with` just pushButton -< X :& Title := title `With` X :& Text := text returnA -< closure