{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
module Data.GCode.RS274 where
import Data.GCode.TH
import Data.GCode.Types
import Data.GCode.RS274.Types
import Data.Maybe (fromJust)
import qualified Data.Map.Strict as M
$(genShortcuts ''RS274Name)
namesToCodes = M.fromList . map (\x -> (defName x, toCode x)) $ allCodes
codesToNames = M.fromList . map (\x -> (toCode x, defName x)) $ allCodes
codesToGroups = M.fromList . map (\x -> (toCode x, defGroup x)) $ allCodes
codesToDefs = M.fromList . map (\x -> (toCode x, x)) $ allCodes
codeIsRS274 code name = (M.lookup (decimate code) codesToNames) == (Just name)
codeInGroup code group = (fmap defGroup $ M.lookup (decimate code) codesToDefs) == (Just group)
explain code@Code{} = case M.lookup (decimate code) codesToDefs of
Nothing -> ""
Just def -> defHelp def
explain _ = ""
codeFromName :: RS274Name -> Code
codeFromName n = fromJust $ M.lookup n namesToCodes
eqClassNumSub :: Code -> Code -> Bool
eqClassNumSub a b = (decimate a) == (decimate b)
decimate :: Code -> Code
decimate x@Code{} | codeCls x `elem` (map Just [T, FStandalone, PStandalone, SStandalone]) = copyClass x emptyCode
decimate x@Code{} = copyClassNumSub x emptyCode
decimate x = x
copyClassNumSub from to = to { codeCls = codeCls from
, codeNum = codeNum from
, codeSub = codeSub from }
copyClass from to = to { codeCls = codeCls from }