{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}

module Data.GCode.Monad where

import Data.GCode.TH
import Data.GCode.Types
import Data.GCode.RS274.Types
import Data.GCode.RS274 (codeFromName)

import Control.Monad.Trans.Writer.Lazy
import Data.Semigroup hiding (option)

 -- this gives us someCode and someCode' shortcuts generated from RS274/Types.hs
-- so we can write
-- > myP = prog $ do
-- >          rapid (xy 5 10)
-- >          move (x 0)
$(genWriterEndos ''RS274Name)

data Program = Program { programCode :: GCode }
  deriving (Eq, Show)

type ProgramWriter a = Writer (Endo Program) a

gen :: Code -> ProgramWriter ()
gen c = tell $ Endo (\x -> x { programCode = c:(programCode x) } )

prog :: ProgramWriter a -> Program
prog builder = appEndo (execWriter (builder >> programEnd')) (Program mempty)

generateName = gen . codeFromName
generateNameArgs name endoF = gen $ codeFromName name & endoF