{-# LANGUAGE GADTs #-}
module DSL.Deep (module DSL.Deep, module DSL.Common) where
import DSL.Common
{-
  Describe what a \emph{deep} implementation could look like. Give a
  type definition and describe (in words or code) what each of your primitive
  operations, and your run function, would do.
-}


data Deep where
  Text   :: Dir -> String -> Art
  Above  :: Art -> Art -> Art
  Beside :: Art -> Art -> Art
  Frame  :: Art -> Art
  -- not in exam question
  Line   :: Int -> Dir -> Art
  Empty  :: Art
  Space  :: ArtSize -> Art
  deriving (Eq, Show)
  
text = Text; frame = Frame; above = Above; beside  = Beside
line = Line; empty = Empty; space = Space

type Art = Deep

-- Run function:
run :: Art -> Sem
run (Text   s d) = textSem s d
run (Above  a b) = aboveSem   (run a) (run b)
run (Beside a b) = besideSem  (run a) (run b)
run (Frame a)    = frameSem   (run a)
run (Line n d)   = lineSem n d
run  Empty       = emptySem
run (Space size) = spaceSem size