{-|
Module      : Dep.Bricks.Circuit
Description : A module that exports widgets to render circuits effectively.
Maintainer  : hapytexeu+gh@gmail.com
Stability   : experimental
Portability : POSIX

A module to render circuits in an effective manner.
-}

module Dep.Bricks.Circuit where

import Brick.Types(Size(Fixed), Widget(Widget), emptyResult, imageL) -- attrL, emptyResult, getContext, imageL)

import Control.Lens.Operators((&), (.~)) -- , (^.))

-- import Dep.Bricks.Gate(genericGate)
-- import Dep.Bricks.Layout(CircuitLayout(Horizontal))
import Dep.Bricks.Karnaugh(renderKarnaugh)
import Dep.Data.Three(Three(Leaf, Split))
-- import Dep.Data.ThreeValue(ThreeValue(Zero, One, DontCare))

import Graphics.Vty.Attributes(defAttr)

-- | A widget that is used to render electronics circuitry.
circuit :: Widget ()
circuit :: Widget ()
circuit = Size -> Size -> RenderM () (Result ()) -> Widget ()
forall n. Size -> Size -> RenderM n (Result n) -> Widget n
Widget Size
Fixed Size
Fixed (RenderM () (Result ()) -> Widget ())
-> RenderM () (Result ()) -> Widget ()
forall a b. (a -> b) -> a -> b
$ do
  -- c <- getContext
  -- let a = c ^. attrL
  -- return (emptyResult & imageL .~ andGateV3 (c ^. attrL))
--  return (emptyResult & imageL .~ genericGate '&' Horizontal [False, True, False, True] True a)
  -- let l0 = Leaf Zero
  -- let l1 = Leaf One
  -- let ld = Leaf DontCare
  let la :: Three Char
la = Char -> Three Char
forall a. a -> Three a
Leaf Char
'a'
  let lb :: Three Char
lb = Char -> Three Char
forall a. a -> Three a
Leaf Char
'b'
  let lc :: Three Char
lc = Char -> Three Char
forall a. a -> Three a
Leaf Char
'c'
  let ld :: Three Char
ld = Char -> Three Char
forall a. a -> Three a
Leaf Char
'd'
  let le :: Three Char
le = Char -> Three Char
forall a. a -> Three a
Leaf Char
'e'
  let lf :: Three Char
lf = Char -> Three Char
forall a. a -> Three a
Leaf Char
'f'
  let lg :: Three Char
lg = Char -> Three Char
forall a. a -> Three a
Leaf Char
'g'
  let lh :: Three Char
lh = Char -> Three Char
forall a. a -> Three a
Leaf Char
'h'
  let li :: Three Char
li = Char -> Three Char
forall a. a -> Three a
Leaf Char
'i'
  let lj :: Three Char
lj = Char -> Three Char
forall a. a -> Three a
Leaf Char
'j'
  let lk :: Three Char
lk = Char -> Three Char
forall a. a -> Three a
Leaf Char
'k'
  let ll :: Three Char
ll = Char -> Three Char
forall a. a -> Three a
Leaf Char
'l'
  let lm :: Three Char
lm = Char -> Three Char
forall a. a -> Three a
Leaf Char
'm'
  let ln :: Three Char
ln = Char -> Three Char
forall a. a -> Three a
Leaf Char
'n'
  let lo :: Three Char
lo = Char -> Three Char
forall a. a -> Three a
Leaf Char
'o'
  let lp :: Three Char
lp = Char -> Three Char
forall a. a -> Three a
Leaf Char
'p'

  let lA :: Three Char
lA = Char -> Three Char
forall a. a -> Three a
Leaf Char
'A'
  let lB :: Three Char
lB = Char -> Three Char
forall a. a -> Three a
Leaf Char
'B'
  let lC :: Three Char
lC = Char -> Three Char
forall a. a -> Three a
Leaf Char
'C'
  let lD :: Three Char
lD = Char -> Three Char
forall a. a -> Three a
Leaf Char
'D'
  let lE :: Three Char
lE = Char -> Three Char
forall a. a -> Three a
Leaf Char
'E'
  let lF :: Three Char
lF = Char -> Three Char
forall a. a -> Three a
Leaf Char
'F'
  let lG :: Three Char
lG = Char -> Three Char
forall a. a -> Three a
Leaf Char
'G'
  let lH :: Three Char
lH = Char -> Three Char
forall a. a -> Three a
Leaf Char
'H'
  let lI :: Three Char
lI = Char -> Three Char
forall a. a -> Three a
Leaf Char
'I'
  let lJ :: Three Char
lJ = Char -> Three Char
forall a. a -> Three a
Leaf Char
'J'
  let lK :: Three Char
lK = Char -> Three Char
forall a. a -> Three a
Leaf Char
'K'
  let lL :: Three Char
lL = Char -> Three Char
forall a. a -> Three a
Leaf Char
'L'
  let lM :: Three Char
lM = Char -> Three Char
forall a. a -> Three a
Leaf Char
'M'
  let lN :: Three Char
lN = Char -> Three Char
forall a. a -> Three a
Leaf Char
'N'
  let lO :: Three Char
lO = Char -> Three Char
forall a. a -> Three a
Leaf Char
'O'
  let lP :: Three Char
lP = Char -> Three Char
forall a. a -> Three a
Leaf Char
'P'

  let tree' :: Three Char
tree' = Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
la Three Char
lb) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lc Three Char
ld)) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
le Three Char
lf) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lg Three Char
lh))) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
li Three Char
lj) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lk Three Char
ll)) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lm Three Char
ln) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lo Three Char
lp)))
  let tree'' :: Three Char
tree'' = Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lA Three Char
lB) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lC Three Char
lD)) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lE Three Char
lF) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lG Three Char
lH))) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lI Three Char
lJ) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lK Three Char
lL)) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lM Three Char
lN) (Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
lO Three Char
lP)))
  let tree''' :: Three Char
tree''' = Three Char -> Three Char -> Three Char
forall a. Three a -> Three a -> Three a
Split Three Char
tree' Three Char
tree''
  -- let tree'''' = Split tree''' tree'''
  -- let tree''''' = Split tree'''' tree''''
  -- let tree'''''' = Split tree''''' tree''''' --}
  let tree :: Three Char
tree = Three Char
tree''' -- Split tree'''''' tree''''''

  -- let tree = Split (Split (Split (Split la lb) (Split lc ld)) (Split (Split le lf) (Split lg lh))) (Split (Split (Split li lj) (Split lk ll)) (Split (Split lm ln) (Split lo lp)))
--   return (emptyResult & imageL .~ renderKarnaugh' (Split (Split (Split (Split l1 l0) l1) (Split (Split l0 l1) l1)) (Split (Split l1 ld) ld)) defAttr)
  Result () -> RenderM () (Result ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Result ()
forall n. Result n
emptyResult Result () -> (Result () -> Result ()) -> Result ()
forall a b. a -> (a -> b) -> b
& (Image -> Identity Image) -> Result () -> Identity (Result ())
forall n. Lens' (Result n) Image
imageL ((Image -> Identity Image) -> Result () -> Identity (Result ()))
-> Image -> Result () -> Result ()
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Three Char -> SumOfProducts -> [String] -> Attr -> Image
forall a.
CharRenderable a =>
Three a -> SumOfProducts -> [String] -> Attr -> Image
renderKarnaugh Three Char
tree SumOfProducts
forall a. Monoid a => a
mempty [String]
forall a. HasCallStack => a
undefined Attr
defAttr)