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