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))]