{-# LANGUAGE Arrows #-}

bar0 f g h x =
  proc (y, z) ->
    (|   test (h f.(h g)  -<  (y x).y z)((h g)  .  h f-<y z  .  (y x))   |)

bar1 f g x y = proc _ -> (f -< x)&&&(g -< y)

bar2 f g h x =
  proc (y, z) ->
    (h f.(h g)  -<  (y x).y z) ||| ((h g)  .  h f-<y z  .  (y x))

bar3 f g h x =
  proc (y, z) ->
    ((h f.h g)
      -<  (y x).y z)
  |||
    ((h g  .  h f)
      -<y z  .  (y x))

bar4 = proc x -> case x of
    Just f -> f -< ()
    Nothing -> x -< ()
 <+> do
         g -< x

expr' = proc x -> do
                returnA -< x
        <+> do
                symbol Plus -< ()
                y <- term -< ()
                expr' -< x + y
        <+> do
                symbol Minus -< ()
                y <- term -< ()
                expr' -< x - y

bar f = proc (a, b) -> do
    (f a -< b)
      >-> (\y -> f b >- a)
      >-> (\y -> f b >- a)
