module Lava.SignalTry where

import Lava.Ref

data Signal a
  = Value a
  | Symbol (Ref (Symbol a))

data Symbol a
  = forall x y . Function String ([x] -> [y] -> a) [Signal x] [Signal y]
  | Delay (Signal a) (Signal a)
  | Variable String

and2 :: (Signal Bool, Signal Bool) -> Signal Bool
and2 :: (Signal Bool, Signal Bool) -> Signal Bool
and2 (x :: Signal Bool
x,y :: Signal Bool
y) = Ref (Symbol Bool) -> Signal Bool
forall a. Ref (Symbol a) -> Signal a
Symbol (Symbol Bool -> Ref (Symbol Bool)
forall a. a -> Ref a
ref (String
-> ([Bool] -> [Any] -> Bool)
-> [Signal Bool]
-> [Signal Any]
-> Symbol Bool
forall a x y.
String -> ([x] -> [y] -> a) -> [Signal x] -> [Signal y] -> Symbol a
Function "and" (\xs :: [Bool]
xs _ -> [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and [Bool]
xs) [Signal Bool
x,Signal Bool
y] []))