class Flor::Pro::Slice

Public Instance Methods

pre_execute() click to toggle source

three cases: [ start, count ], [ start, end ], and [ start, end, step ]

# File lib/flor/pcore/slice.rb, line 57
def pre_execute

  unatt_unkeyed_children

  @node['atts'] = []
  @node['rets'] = []
end
receive_last() click to toggle source
# File lib/flor/pcore/slice.rb, line 65
def receive_last

  send(heap)
end

Protected Instance Methods

collection() click to toggle source
# File lib/flor/pcore/slice.rb, line 72
def collection

  coll =
    @node['rets'].find { |e| e.respond_to?(:slice) } ||
    node_payload_ret

  fail Flor::FlorError.new(
    "cannot slice instance of #{coll.class}", self
  ) unless coll.respond_to?(:slice)

  coll
end
do_slice(coll, st, en, sp, join=false) click to toggle source
# File lib/flor/pcore/slice.rb, line 114
def do_slice(coll, st, en, sp, join=false)

  l = coll.length

  return nil if st >= l

  r = []

  while st <= en && st < l
    r << coll[st]
    st = st + sp
  end

  join ? r.join : r
end
index() click to toggle source
# File lib/flor/pcore/slice.rb, line 130
def index

  coll = collection
  index = att('at') || @node['rets'].find { |e| e.is_a?(Integer) }

  wrap('ret' => coll[index] || '')
end
slice() click to toggle source
# File lib/flor/pcore/slice.rb, line 85
def slice

  coll = collection

  ints = @node['rets'].select { |e| e.is_a?(Integer) }

  st = att('from', 'start') || ints.shift || 0
  en = att('to', 'end') || ints.shift
  co = att('count')
  sp = att('step') || 1

  en ||= (st + co - 1)
  en = coll.length + en if en < 0

  ret =
    case coll
    when String
      do_slice(coll.chars, st, en, sp, true)
    when Array
      do_slice(coll, st, en, sp)
    else
      fail Flor::FlorError.new("cannot slice instance of #{coll.class}", self)
    end

  ret ||= ''

  wrap('ret' => ret)
end