Sha256: fa5389b4065faa3a999f5bc78121e97887af483c18eb9a285c012fe857f38207

Contents?: true

Size: 1.85 KB

Versions: 3

Compression:

Stored size: 1.85 KB

Contents

module Docks
  class Process
    @@pattern_processors = { early: [], middle: [], late: [] }
    @@pattern_library_processors = { early: [], middle: [], late: [] }

    def self.process(item)
      case item
      when Containers::Symbol then item = process_symbol(item)
      when Containers::Pattern then process_pattern(item)
      when Containers::PatternLibrary then process_pattern_library(item)
      end

      item
    end

    def self.register_pattern_processor(hook = :middle, &block)
      @@pattern_processors[hook] << block unless @@pattern_processors[hook].include?(block)
    end

    def self.register_pattern_library_processor(hook = :middle, &block)
      @@pattern_library_processors[hook] << block unless @@pattern_library_processors[hook].include?(block)
    end

    private

    def self.clean
      @@pattern_processors = { early: [], middle: [], late: [] }
      @@pattern_library_processors = { early: [], middle: [], late: [] }
    end

    def self.process_symbol(symbol)
      # For when the initial symbol type was overwritten
      if symbol.symbol_type != symbol.class.type
        symbol = Containers.container_for(symbol.symbol_type).new(symbol.to_h)
      end

      # Allow tags to change the symbol's type
      tags = symbol.tags
      tags.each do |tag|
        next unless tag.respond_to?(:process)
        new_symbol = tag.process(symbol)
        symbol = new_symbol if new_symbol.kind_of?(Containers::Symbol)
      end

      symbol
    end

    def self.process_pattern(pattern)
      [:early, :middle, :late].each do |hook|
        @@pattern_processors[hook].each { |processor| processor.call(pattern) }
      end
    end

    def self.process_pattern_library(pattern_library)
      [:early, :middle, :late].each do |hook|
        @@pattern_library_processors[hook].each { |processor| processor.call(pattern_library) }
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
docks_app-0.0.3 lib/docks/process.rb
docks_app-0.0.2 lib/docks/process.rb
docks_app-0.0.1 lib/docks/process.rb