{- |
   Module      :   Cookbook.Project.Preprocess.Preprocess
   Copyright   :   (c) 2014 by Nate Pisarski
   License     :   BSD3
   Maintainer  :   nathanpisarski@gmail.com
   Stability   :   Stable
   Portability :   Portable (Cookbook
A library for preprocessing information using replacing sweeps. Supports inline comments. Does not currently support whitespace-insignificant parsing.
-}

module Cookbook.Project.Preprocess.Preprocess where

import qualified Cookbook.Ingredients.Lists.Modify  as Md
import qualified Cookbook.Essential.Common          as Cm
import qualified Cookbook.Essential.Continuous      as Ct

-- | Binds possibly multiple inputs on one line to one input. General syntax is: inp1|inp2_out
makeParams :: String -> [(String,String)]
makeParams x = flip zip (repeat lastPart) $ Md.splitOn firstPart '|'
  where (firstPart:lastPart:[]) = Md.splitOn x '_'

-- | Sanitizes the strings before parsing.
sanitize :: String -> String
sanitize x = Ct.splice x ('$','$')

-- | Generate Program Language. Generates a list of input-output pairs to be replaced.
gPL :: [String] -> [(String,String)]
gPL x = Cm.flt $ map makeParams sanitized
  where sanitized = Ct.remove (map (\c -> if length c > 3 then sanitize c else "") x) ""