# Circuit arrows

Simple update of the circuit arrows from Programming with Arrows to work with the modern Arrow libraries.

``````module Circuits where

import Control.Arrow
import Data.List

class ArrowLoop a => ArrowCircuit a where
delay :: b -> a b b

nor :: Arrow a => a (Bool,Bool) Bool
nor = arr (not.uncurry (||))

flipflop :: ArrowCircuit a => a (Bool,Bool) (Bool,Bool)
flipflop = loop (arr (\((a,b),(c,d)) -> ((a,d),(b,c))) >>>
nor *** nor >>>
delay (False,True) >>>
arr id &&& arr id)

class Signal a where
showSignal :: [a] -> String

instance Signal Bool where
showSignal bs = concat top++"\n"++concat bot++"\n"
where (top,bot) = unzip (zipWith sh (False:bs) bs)
sh True True = ("__","  ")
sh True False = ("  ","|_")
sh False True = (" _","| ")
sh False False = ("  ","__")

instance (Signal a,Signal b) => Signal (a,b) where
showSignal xys = showSignal (map fst xys)++showSignal (map snd xys)

instance Signal a => Signal [a] where
showSignal = concatMap showSignal . transpose

sig :: [(Int, a)] -> [a]
sig = concatMap (uncurry replicate)

flipflopInput :: [(Bool, Bool)]
flipflopInput = sig
[(5,(False,False)),(2,(False,True)),(5,(False,False)),
(2,(True,False)),(5,(False,False)),(2,(True,True)),
(6,(False,False))]``````