module Diagrams.Puzzles.PuzzleGrids where
import Diagrams.Prelude
import Data.Puzzles.Grid
import Data.Puzzles.Elements
import Data.Puzzles.Sudoku
import Diagrams.Puzzles.Lib
import Diagrams.Puzzles.Grid
import Diagrams.Puzzles.Widths
import Diagrams.Puzzles.Elements
drawFillo :: (Backend b R2, Renderable (Path R2) b) =>
SGrid (Clue Int) -> Diagram b R2
drawFillo = drawIntClues <> dashedgrid . size
drawClueGrid :: (Backend b R2, Renderable (Path R2) b) =>
SGrid (Clue Char) -> Diagram b R2
drawClueGrid = atCentres drawChar . clues <> grid . size
drawIntClues :: (Backend b R2, Renderable (Path R2) b) =>
SGrid (Clue Int) -> Diagram b R2
drawIntClues = atCentres drawInt . clues
drawInts :: (Backend b R2, Renderable (Path R2) b) =>
SGrid Int -> Diagram b R2
drawInts = atCentres drawInt . values
drawIntGrid :: (Backend b R2, Renderable (Path R2) b) =>
SGrid (Clue Int) -> Diagram b R2
drawIntGrid = drawIntClues <> grid . size
drawSlitherGrid :: (Backend b R2, Renderable (Path R2) b) =>
SGrid (Clue Int) -> Diagram b R2
drawSlitherGrid = atCentres drawInt . clues <> slithergrid . size
drawMasyuGrid :: (Backend b R2, Renderable (Path R2) b) =>
SGrid MasyuClue -> Diagram b R2
drawMasyuGrid = atCentres pearl . clues <> grid . size
drawCompassClues :: (Backend b R2, Renderable (Path R2) b) =>
SGrid CompassClue -> Diagram b R2
drawCompassClues = atCentres drawCompassClue . clues
drawCompassGrid :: (Backend b R2, Renderable (Path R2) b) =>
SGrid CompassClue -> Diagram b R2
drawCompassGrid = drawCompassClues <> grid . size
sudokugrid :: (Backend b R2, Renderable (Path R2) b) =>
SGrid a -> Diagram b R2
sudokugrid = drawEdges . sudokubordersg <> grid . size
drawWordsClues :: (Backend b R2, Renderable (Path R2) b) =>
SGrid (Clue [String]) -> Diagram b R2
drawWordsClues = atCentres drawWords . clues
drawTightGrid :: (Backend b R2, Renderable (Path R2) b) =>
(t -> Diagram b R2) -> SGrid (Tightfit t) -> Diagram b R2
drawTightGrid d g = atCentres (drawTight d) (values g)
<> grid (size g)
<> phantom' (border (sx + 2, sy + 2) # translate (r2 (1,1)))
where (sx, sy) = size g
drawSlalomGrid :: (Backend b R2, Renderable (Path R2) b) =>
SGrid (Clue Int) -> Diagram b R2
drawSlalomGrid g = atVertices drawSlalomClue (clues g)
<> grid (w1, h1)
<> phantom' (border (size g)) # translate (r2 (1/2,1/2))
where (w, h) = size g
drawSlalomDiags :: (Backend b R2, Renderable (Path R2) b) =>
SGrid SlalomDiag -> Diagram b R2
drawSlalomDiags = atCentres diag . clues . fmap Just
where diag SlalomForward = stroke ur # lw edgewidth
diag SlalomBackward = stroke dr # lw edgewidth
drawCrosses :: (Backend b R2, Renderable (Path R2) b) =>
SGrid Bool -> Diagram b R2
drawCrosses = atCentres (if' drawCross mempty) . values
where
if' a b x = if x then a else b