# frozen_string_literal: true # Provides logic evaluation functionalities. module LogicHelper # /** # * Custom logical AND/OR evaluator. # * # * @author Royce # */ TRUE = '|true' FALSE = '|false' # /** # * @param scenario list of scenario tokens. # * @param left_subscript left index. # * @param right_subscript right index. # * @param left left token. # * @param right right token. # */ def perform_logical_and(scenario: [], left_subscript: -1, right_subscript: -1, left: nil, right: nil) if FALSE == left || FALSE == right FALSE elsif TRUE == left && TRUE == right TRUE elsif TRUE == left if right_subscript < 0 scenario.include?(right).to_s else (scenario[right_subscript] == right).to_s end elsif TRUE == right if left_subscript < 0 scenario.include?(left).to_s else (scenario[left_subscript] == left).to_s end else left_eval = pevaluate( scenario: scenario, subscript: left_subscript, object: left ) right_eval = pevaluate( scenario: scenario, subscript: right_subscript, object: right ) (left_eval && right_eval).to_s end end # /** # * @param scenario list of scenario tokens. # * @param left_subscript left index. # * @param right_subscript right index. # * @param left left token. # * @param right right token. # */ def perform_logical_or(scenario: [], left_subscript: -1, right_subscript: -1, left: nil, right: nil) if TRUE == left || TRUE == right TRUE elsif FALSE == left && FALSE == right FALSE elsif FALSE == left if right_subscript < 0 scenario.include?(right).to_s else (scenario[right_subscript] == right).to_s end elsif FALSE == right if left_subscript < 0 scenario.include?(left).to_s else (scenario[left_subscript]).to_s == left end else left_eval = pevaluate( scenario: scenario, subscript: left_subscript, object: left ) right_eval = pevaluate( scenario: scenario, subscript: right_subscript, object: right ) (left_eval || right_eval).to_s end end # /** # * Helper method to evaluate left or right token. # * # * @param scenario list of scenario tokens. # * @param subscript scenario token subscript. # * @param object left or right token. # */ def pevaluate(scenario: [], subscript: -1, object: nil) if subscript < 0 scenario.include?(object) else scenario[subscript] == object end end # /** # * Check if the token is opening bracket. # * # * @param token Input String token # * @return boolean output # */ def open_bracket?(token: '') token == '(' end # /** # * Check if the token is closing bracket. # * # * @param token Input String token # * @return boolean output # */ def close_bracket?(token: '') token == ')' end end