module Dep.Bricks.Gate (
gateH, gateV, gate, genericGate
, andGate, andGateH, andGateH2, andGateH3, andGateV, andGateV2, andGateV3
, orGate, orGateH, orGateH2, orGateH3, orGateV, orGateV2, orGateV3
) where
import Dep.Bricks.Box(boxh, boxhu, boxhd, boxlt, boxrt, boxlb, boxrb, boxv, boxvl, boxvr)
import Dep.Bricks.Layout(CircuitLayout(Horizontal, Vertical))
import Dep.Bricks.Negation(negationH, negationV, negationHList, negationVList)
import Graphics.Vty.Attributes(Attr)
import Graphics.Vty.Image(Image, (<->), (<|>), char, emptyImage, string)
vstring :: Attr -> String -> Image
vstring :: Attr -> String -> Image
vstring Attr
atr = (Char -> Image -> Image) -> Image -> String -> Image
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Image -> Image -> Image
(<->) (Image -> Image -> Image)
-> (Char -> Image) -> Char -> Image -> Image
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Attr -> Char -> Image
char Attr
atr) Image
emptyImage
gateLineH :: Char -> Char -> Char -> Int -> Attr -> Image
gateLineH :: Char -> Char -> Char -> Int -> Attr -> Image
gateLineH Char
c0 Char
ci Char
cn Int
n = (Attr -> String -> Image
`string` (Char
c0 Char -> String -> String
forall a. a -> [a] -> [a]
: Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
n Char
ci String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
cn]))
gateLineV :: Char -> Char -> Char -> Int -> Attr -> Image
gateLineV :: Char -> Char -> Char -> Int -> Attr -> Image
gateLineV Char
c0 Char
ci Char
cn Int
n = (Attr -> String -> Image
`vstring` (Char
c0 Char -> String -> String
forall a. a -> [a] -> [a]
: Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
n Char
ci String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
cn]))
gateH
:: Char
-> Int
-> Attr
-> Image
gateH :: Char -> Int -> Attr -> Image
gateH Char
ci Int
n Attr
attr = Char -> Char -> Char -> Int -> Attr -> Image
gateLineH Char
boxlt Char
boxhu Char
boxrt Int
n Attr
attr Image -> Image -> Image
<-> Char -> Char -> Char -> Int -> Attr -> Image
gateLineH Char
boxv Char
ci Char
boxv Int
n Attr
attr Image -> Image -> Image
<-> Attr -> String -> Image
string Attr
attr (Char
boxlb Char -> String -> String
forall a. a -> [a] -> [a]
: Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
n2 Char
boxh String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char
boxhd Char -> String -> String
forall a. a -> [a] -> [a]
: Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
n2Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Char
boxh String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
boxrb])
where n2 :: Int
n2 = Int -> Int -> Int
forall a. Integral a => a -> a -> a
div Int
n Int
2
gateV
:: Char
-> Int
-> Attr
-> Image
gateV :: Char -> Int -> Attr -> Image
gateV Char
ci Int
n Attr
attr = Char -> Char -> Char -> Int -> Attr -> Image
gateLineV Char
boxlt Char
boxvl Char
boxlb Int
n Attr
attr Image -> Image -> Image
<|> Char -> Char -> Char -> Int -> Attr -> Image
gateLineV Char
boxh Char
ci Char
boxh Int
n Attr
attr Image -> Image -> Image
<|> Attr -> String -> Image
vstring Attr
attr (Char
boxrt Char -> String -> String
forall a. a -> [a] -> [a]
: Int -> Char -> String
forall a. Int -> a -> [a]
replicate Int
n2 Char
boxv String -> String -> String
forall a. [a] -> [a] -> [a]
++ Char
boxvr Char -> String -> String
forall a. a -> [a] -> [a]
: Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
n2Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Char
boxv String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Char
boxrb])
where n2 :: Int
n2 = Int -> Int -> Int
forall a. Integral a => a -> a -> a
div Int
n Int
2
gate
:: Char
-> CircuitLayout
-> Int
-> Attr
-> Image
gate :: Char -> CircuitLayout -> Int -> Attr -> Image
gate = (CircuitLayout -> Char -> Int -> Attr -> Image)
-> Char -> CircuitLayout -> Int -> Attr -> Image
forall a b c. (a -> b -> c) -> b -> a -> c
flip CircuitLayout -> Char -> Int -> Attr -> Image
go
where go :: CircuitLayout -> Char -> Int -> Attr -> Image
go CircuitLayout
Horizontal = Char -> Int -> Attr -> Image
gateH
go CircuitLayout
Vertical = Char -> Int -> Attr -> Image
gateV
negationOut :: Int -> (Image -> Image -> Image) -> (Bool -> Attr -> Image) -> Bool -> Attr -> Image
negationOut :: Int
-> (Image -> Image -> Image)
-> (Bool -> Attr -> Image)
-> Bool
-> Attr
-> Image
negationOut Int
n Image -> Image -> Image
mgr Bool -> Attr -> Image
wr Bool
bl Attr
atr = (Image -> Image -> Image) -> Image -> [Image] -> Image
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ((Image -> Image -> Image) -> Image -> Image -> Image
forall a b c. (a -> b -> c) -> b -> a -> c
flip Image -> Image -> Image
mgr) Image
emptyImage (Bool -> Attr -> Image
wr Bool
bl Attr
atr Image -> [Image] -> [Image]
forall a. a -> [a] -> [a]
: Int -> Image -> [Image]
forall a. Int -> a -> [a]
replicate (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) (Attr -> Char -> Image
char Attr
atr Char
' '))
genericGate
:: Char
-> CircuitLayout
-> [Bool]
-> Bool
-> Attr
-> Image
genericGate :: Char -> CircuitLayout -> [Bool] -> Bool -> Attr -> Image
genericGate Char
ci CircuitLayout
ly [Bool]
ngi Bool
ng Attr
atr = CircuitLayout -> Image
go CircuitLayout
ly
where go :: CircuitLayout -> Image
go CircuitLayout
Horizontal = (Attr -> Char -> Image
char Attr
atr Char
' ' Image -> Image -> Image
<|> [Bool] -> Attr -> Image
negationHList [Bool]
ngi Attr
atr) Image -> Image -> Image
<-> Char -> Int -> Attr -> Image
gateH Char
ci Int
n Attr
atr Image -> Image -> Image
<-> Int
-> (Image -> Image -> Image)
-> (Bool -> Attr -> Image)
-> Bool
-> Attr
-> Image
negationOut Int
n2 Image -> Image -> Image
(<|>) Bool -> Attr -> Image
negationH Bool
ng Attr
atr
go CircuitLayout
Vertical = (Attr -> Char -> Image
char Attr
atr Char
' ' Image -> Image -> Image
<-> [Bool] -> Attr -> Image
negationVList [Bool]
ngi Attr
atr) Image -> Image -> Image
<|> Char -> Int -> Attr -> Image
gateV Char
ci Int
n Attr
atr Image -> Image -> Image
<|> Int
-> (Image -> Image -> Image)
-> (Bool -> Attr -> Image)
-> Bool
-> Attr
-> Image
negationOut Int
n2 Image -> Image -> Image
(<->) Bool -> Attr -> Image
negationV Bool
ng Attr
atr
n :: Int
n = [Bool] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Bool]
ngi
n2 :: Int
n2 = Int -> Int -> Int
forall a. Integral a => a -> a -> a
div Int
n Int
2
andGate
:: CircuitLayout
-> Int
-> Attr
-> Image
andGate :: CircuitLayout -> Int -> Attr -> Image
andGate = Char -> CircuitLayout -> Int -> Attr -> Image
gate Char
'&'
andGateH
:: Int
-> Attr
-> Image
andGateH :: Int -> Attr -> Image
andGateH = Char -> Int -> Attr -> Image
gateH Char
'&'
andGateH2
:: Attr
-> Image
andGateH2 :: Attr -> Image
andGateH2 = Int -> Attr -> Image
andGateH Int
2
andGateH3
:: Attr
-> Image
andGateH3 :: Attr -> Image
andGateH3 = Int -> Attr -> Image
andGateH Int
3
andGateV
:: Int
-> Attr
-> Image
andGateV :: Int -> Attr -> Image
andGateV = Char -> Int -> Attr -> Image
gateV Char
'&'
andGateV2
:: Attr
-> Image
andGateV2 :: Attr -> Image
andGateV2 = Int -> Attr -> Image
andGateV Int
2
andGateV3
:: Attr
-> Image
andGateV3 :: Attr -> Image
andGateV3 = Int -> Attr -> Image
andGateV Int
3
orGate
:: CircuitLayout
-> Int
-> Attr
-> Image
orGate :: CircuitLayout -> Int -> Attr -> Image
orGate = Char -> CircuitLayout -> Int -> Attr -> Image
gate Char
'|'
orGateH
:: Int
-> Attr
-> Image
orGateH :: Int -> Attr -> Image
orGateH = CircuitLayout -> Int -> Attr -> Image
orGate CircuitLayout
Horizontal
orGateH2
:: Attr
-> Image
orGateH2 :: Attr -> Image
orGateH2 = Int -> Attr -> Image
orGateH Int
2
orGateH3
:: Attr
-> Image
orGateH3 :: Attr -> Image
orGateH3 = Int -> Attr -> Image
orGateH Int
3
orGateV
:: Int
-> Attr
-> Image
orGateV :: Int -> Attr -> Image
orGateV = CircuitLayout -> Int -> Attr -> Image
orGate CircuitLayout
Vertical
orGateV2
:: Attr
-> Image
orGateV2 :: Attr -> Image
orGateV2 = Int -> Attr -> Image
orGateV Int
2
orGateV3
:: Attr
-> Image
orGateV3 :: Attr -> Image
orGateV3 = Int -> Attr -> Image
orGateV Int
3