Class: Puppet::Pops::Types::PArrayType

Inherits:
PCollectionType show all
Defined in:
lib/puppet/pops/types/types.rb

Constant Summary collapse

DATA =
PArrayType.new(PDataType::DEFAULT, DEFAULT_SIZE)
DEFAULT =
PArrayType.new(nil)
EMPTY =
PArrayType.new(PUnitType::DEFAULT, ZERO_SIZE)

Constants inherited from PCollectionType

Puppet::Pops::Types::PCollectionType::DEFAULT_SIZE, Puppet::Pops::Types::PCollectionType::NOT_EMPTY_SIZE, Puppet::Pops::Types::PCollectionType::ZERO_SIZE

Instance Attribute Summary collapse

Attributes inherited from PCollectionType

#size_type

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PCollectionType

#has_empty_range?, #iterable?, #size_range

Methods inherited from PAnyType

#==, #assignable?, #callable?, #callable_with?, #check_self_recursion, #create, #iterable?, #kind_of_callable?, #name, #new_function, #really_instance?, #simple_name, simple_name, #to_alias_expanded_s, #to_s

Methods inherited from TypedModelObject

_ptype, create_ptype, register_ptypes

Methods included from PuppetObject

#_ptype

Constructor Details

#initialize(element_type, size_type = nil) ⇒ PArrayType

Returns a new instance of PArrayType.



2333
2334
2335
2336
2337
2338
2339
2340
# File 'lib/puppet/pops/types/types.rb', line 2333

def initialize(element_type, size_type = nil)
  super(size_type)
  if !size_type.nil? && size_type.from == 0 && size_type.to == 0
    @element_type = PUnitType::DEFAULT
  else
    @element_type = element_type
  end
end

Instance Attribute Details

#element_typeObject (readonly)



2331
2332
2333
# File 'lib/puppet/pops/types/types.rb', line 2331

def element_type
  @element_type
end

Class Method Details

.new_function(_, loader) ⇒ Object

Returns a new function that produces an Array



2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
# File 'lib/puppet/pops/types/types.rb', line 2405

def self.new_function(_, loader)
  @new_function ||= Puppet::Functions.create_loaded_function(:new_array, loader) do

    dispatch :from_args do
      param           'Any',  :from
      optional_param  'Boolean',      :wrap
    end

    def from_args(from, wrap = false)
      case from
      when NilClass
        if wrap
          [nil]
        else
          throw :undefined_value
        end
      when Array
        from
      when Hash
        wrap ? [from] : from.to_a

      when PBinaryType::Binary
        # For older rubies, the #bytes method returns an Enumerator that must be rolled out
        wrap ? [from] : from.binary_buffer.bytes.to_a

      else
        if wrap
          [from]
        else
          if PIterableType::DEFAULT.instance?(from)
            Iterable.on(from).to_a
          else
            t = Puppet::Pops::Types::TypeCalculator.singleton.infer(from).generalize
            raise TypeConversionError.new("Value of type '#{t}' cannot be converted to Array")
          end
        end
      end
    end
  end
end

.register_ptype(loader, ir) ⇒ Object



2322
2323
2324
2325
2326
2327
2328
2329
# File 'lib/puppet/pops/types/types.rb', line 2322

def self.register_ptype(loader, ir)
  create_ptype(loader, ir, 'CollectionType',
    'element_type' => {
      KEY_TYPE => POptionalType.new(PType::DEFAULT),
      KEY_VALUE => nil
    }
  )
end

Instance Method Details

#accept(visitor, guard) ⇒ Object



2342
2343
2344
2345
# File 'lib/puppet/pops/types/types.rb', line 2342

def accept(visitor, guard)
  super
  @element_type.accept(visitor, guard) unless @element_type.nil?
end

#callable_args?(callable, guard = nil) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


2348
2349
2350
2351
2352
2353
# File 'lib/puppet/pops/types/types.rb', line 2348

def callable_args?(callable, guard = nil)
  param_t = callable.param_types
  block_t = callable.block_type
  # does not support calling with a block, but have to check that callable is ok with missing block
  (param_t.nil? || param_t.assignable?(self, guard)) && (block_t.nil? || block_t.assignable?(PUndefType::DEFAULT, guard))
end

#eql?(o) ⇒ Boolean

Returns:

  • (Boolean)


2366
2367
2368
# File 'lib/puppet/pops/types/types.rb', line 2366

def eql?(o)
  super && @element_type == o.element_type
end

#generalizeObject



2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
# File 'lib/puppet/pops/types/types.rb', line 2355

def generalize
  if self == DATA
    self
  elsif @element_type.nil?
    DEFAULT
  else
    ge_type = @element_type.generalize
    @size_type.nil? && @element_type.equal?(ge_type) ? self : self.class.new(ge_type, nil)
  end
end

#hashObject



2370
2371
2372
# File 'lib/puppet/pops/types/types.rb', line 2370

def hash
  super ^ @element_type.hash
end

#instance?(o, guard = nil) ⇒ Boolean

Returns:

  • (Boolean)


2391
2392
2393
2394
2395
2396
2397
# File 'lib/puppet/pops/types/types.rb', line 2391

def instance?(o, guard = nil)
  return false unless o.is_a?(Array)
  element_t = element_type
  return false unless element_t.nil? || o.all? {|element| element_t.instance?(element, guard) }
  size_t = size_type
  size_t.nil? || size_t.instance?(o.size, guard)
end

#iterable_type(guard = nil) ⇒ Object



2399
2400
2401
# File 'lib/puppet/pops/types/types.rb', line 2399

def iterable_type(guard = nil)
  @element_type.nil? ? PIterableType::DEFAULT : PIterableType.new(@element_type)
end

#normalize(guard = nil) ⇒ Object



2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
# File 'lib/puppet/pops/types/types.rb', line 2374

def normalize(guard = nil)
  if self == DATA
    self
  elsif @element_type.nil?
    DEFAULT
  else
    ne_type = @element_type.normalize(guard)
    @element_type.equal?(ne_type) ? self : self.class.new(ne_type, @size_type)
  end
end

#resolve(type_parser, loader) ⇒ Object



2385
2386
2387
2388
2389
# File 'lib/puppet/pops/types/types.rb', line 2385

def resolve(type_parser, loader)
  relement_type = @element_type
  relement_type = relement_type.resolve(type_parser, loader) unless relement_type.nil?
  relement_type.equal?(@element_type) ? self : self.class.new(relement_type, @size_type)
end