/**
 * Stratego Bindings for controlling the filter settings of SGLR.
 *
 * @author Martin Bravenboer
 */
module stratego/sglr/filter
imports
  libstratego-lib

strategies

  /**
   * Set the direct eagerness filter.
   *
   * @param true (success) or false (failure)
   */
  set-filter-direct-eagerness(s) =
    if s then
      where(prim("STRSGLR_set_filter_direct_eagernes_on"))
    else
      where(prim("STRSGLR_set_filter_direct_eagernes_off"))
    end

  /**
   * Succeeds if the direct eagerness filter is enabled.
   *
   * @type  t -> t
   */
  get-filter-direct-eagerness =
    where(prim("STRSGLR_get_filter_direct_eagernes"))

strategies

  /**
   * Set the eagerness filter.
   *
   * @param true (success) or false (failure)
   * @type  t -> t
   */
  set-filter-eagerness(s) =
    if s then
      where(prim("STRSGLR_set_filter_eagernes_on"))
    else
      where(prim("STRSGLR_set_filter_eagernes_off"))
    end

  /**
   * Succeeds if the eagerness filter is enabled.
   *
   * @type  t -> t
   */
  get-filter-eagerness =
    where(prim("STRSGLR_get_filter_eagernes"))

strategies

  /**
   * Set the injection count filter.
   *
   * @param true (success) or false (failure)
   */
  set-filter-injection-count(s) =
    if s then
      where(prim("STRSGLR_set_filter_injection_count_on"))
    else
      where(prim("STRSGLR_set_filter_injection_count_off"))
    end

  /**
   * Succeeds if the injection-count filter is enabled.
   *
   * @type  t -> t
   */
  get-filter-injection-count =
    where(prim("STRSGLR_get_filter_injection_count"))

strategies

  /**
   * Set the priority filter.
   *
   * @param true (success) or false (failure)
   */
  set-filter-priority(s) =
    if s then
      where(prim("STRSGLR_set_filter_priority_on"))
    else
      where(prim("STRSGLR_set_filter_priority_off"))
    end

  /**
   * Succeeds if the priority filter is enabled.
   *
   * @type  t -> t
   */
  get-filter-priority =
    where(prim("STRSGLR_get_filter_priority"))

strategies

  /**
   * Set the reject filter.
   *
   * @param true (success) or false (failure)
   */
  set-filter-reject(s) =
    if s then
      where(prim("STRSGLR_set_filter_reject_on"))
    else
      where(prim("STRSGLR_set_filter_reject_off"))
    end

  /**
   * Succeeds if the priority filter is enabled.
   *
   * @type  t -> t
   */
  get-filter-reject =
    where(prim("STRSGLR_get_filter_reject"))

strategies

  set-heuristic-filters(s) =
    set-filter-eagerness(s)
    ; set-filter-injection-count(s) 

  /**
   * @type Filter -> Filter
  set-filter(s) = id
   */

  /**
   * @type Filter ->? Filter
  get-filter(s) = id
   */

  /**
   * @type Filter ->? Filter
  is-filter-enabled =
    get-filter(true)
   */
 
  /**
   * @type List(Filter) -> List(Filter)
  set-filters = id
   */

  /**
   * @type a -> List(Filter)
  get-filters = id
   */

  /**
   * Set the filter configuration to the default: all filters enabled,
   * except for the heuristic eagerness and injection count filters.
   */
  set-default-filters =
    where(prim("STRSGLR_set_default_filters"))

signature
  constructors
    AssociativityFilter   : Filter
    DirectEagernessFilter : Filter
    EagernessFilter       : Filter
    InjectionCountFilter  : Filter
    PriorityFilter        : Filter
    RejectFilter          : Filter