module System.Console.Hawk.UserExpr.InputReadyExpr where import qualified Data.ByteString.Lazy.Char8 as B import Data.HaskellExpr import Data.HaskellExpr.Base import System.Console.Hawk.Runtime import System.Console.Hawk.Runtime.HaskellExpr import System.Console.Hawk.UserExpr.OriginalExpr -- | While the original user input may describe a value or a function on a -- single record, the processed user expression is always a function on -- the entire input. Also, its output is wrapped in `SomeRows`, to make -- sure we don't accidentally rely on the fake `()` return type used by -- `OriginalExpr`. type InputReadyExpr = UserExpr (() -> SomeRows) (B.ByteString -> SomeRows) ([B.ByteString] -> SomeRows) ([[B.ByteString]] -> SomeRows) -- | Asserts that the user expression is not a function, and applies `const` -- to it in order to make it a function. constExpr :: OriginalExpr -> InputReadyExpr constExpr (UserExpr e _ _ _) = UserExpr (eAp eConst . eAp eSomeRows <$> e) (eAp eConst . eAp eSomeRows <$> e) (eAp eConst . eAp eSomeRows <$> e) (eAp eConst . eAp eSomeRows <$> e) -- | Asserts that the user expression is a function. applyExpr :: OriginalExpr -> InputReadyExpr applyExpr (UserExpr _ e1 e2 e3) = UserExpr Nothing (eComp eSomeRows <$> e1) (eComp eSomeRows <$> e2) (eComp eSomeRows <$> e3) -- | Asserts that the user expression is a function on one record, and applies -- `map` to it in order to make it a function on all records. mapExpr :: OriginalExpr -> InputReadyExpr mapExpr (UserExpr _ e1 e2 _) = UserExpr Nothing Nothing (eComp eSomeRows . eAp eMap <$> e1) (eComp eSomeRows . eAp eMap <$> e2)