use v6;

use DSL::Shared::Roles::English::PipelineCommand;
use DSL::Shared::Utilities::FuzzyMatching;

# Time series and regression specific phrases
role DSL::English::QuantileRegressionWorkflows::Grammar::TimeSeriesAndRegressionPhrases
        does DSL::Shared::Roles::English::PipelineCommand {

    # Proto tokens
    token LeastSquares-name { 'LeastSquares' }
    token QuantileRegression-name { 'QuantileRegression' }
    token QuantileRegressionFit-name { 'QuantileRegressionFit' }
    token absolute-adjective { 'absolute' }
    token anomalies-noun { 'anomalies' }
    token anomaly-noun { 'anomaly' }
    token average-adjective { 'average' | 'mean' }
    token curve-noun { 'curve' }
    token curves-noun { 'curves' }
    token degree-noun { 'degree' }
    token error-noun { 'error' }
    token errors-noun { 'error' | 'errors' }
    token fit-noun { 'fit' | 'fitting' }
    token fitted-adjective { 'fitted' }
    token hold-verb { 'hold' }
    token interpolation-adjective { <interpolation-noun> }
    token interpolation-noun { 'interpolation' }
    token knots-noun { 'knots' }
    token least-adjective { 'least' }
    token linear-adjective { 'linear' }
    token map-noun { 'map' }
    token mean-adjective { <mean-noun> }
    token mean-noun { 'mean' }
    token median-adjective { <median-noun> }
    token median-noun { 'median' }
    token moving-adjective { 'moving' }
    token order-noun { 'order'  }
    token origin-noun { 'origin' }
    token probabilities-noun { 'probabilities' }
    token probability-noun { 'probability' }
    token quantile-adjective { <quantile-noun> }
    token quantile-noun { 'quantile' }
    token quantiles-noun { 'quantiles' }
    token regressand-noun { 'regressand' }
    token regression-noun { 'regression' }
    token regressor-noun { 'regressor' }
    token relative-adjective { 'relative' }
    token residuals-noun { 'residuals' }
    token squares-noun { 'squares' }
    token x-symbol { 'x' | 'X' }
    token y-symbol { 'y' | 'Y' }

    # Directives
    token resample-directive { 'resample' }
    token rescale-directive { 'rescale' }

    # Rules
    rule least-squares-phrase { <least-adjective> <squares-noun> }
    rule qr-object { [ 'QR' | 'qr' | <quantile-regression-phrase> ]? <object-noun> }
    rule quantile-regression-phrase { <quantile-adjective> <regression-noun> }
    rule regression-known-function-name { <QuantileRegression-name> | <QuantileRegressionFit-name> | <LeastSquares-name> }
    rule the-outliers { <the-determiner> <outliers-noun> }
    rule time-axis-phrase { <time-noun> <axis-noun> }
    rule value-axis-phrase { <value-noun> <axis-noun> }
    rule value-from-left-phrase { <value-noun> <from-preposition> <left-noun> }

}
