note
	description: "Dynamically modifiable chains"
	library: "Free implementation of ELKS library"
	legal: "See notice at end of class."
	status: "See notice at end of class."
	names: dynamic_chain, sequence
	access: index, cursor, membership
	contents: generic
	date: "$Date: 2019-06-20 20:43:33 +0000 (Thu, 20 Jun 2019) $"
	revision: "$Revision: 103306 $"

deferred class interface
	DYNAMIC_CHAIN [G]

feature -- Status report

	extendible: BOOLEAN
			-- May new items be added? (Answer: yes.)
	
feature -- Element change

	put_front (v: like item)
			-- Add v at beginning.
			-- Do not move cursor.
		require
			extendible: extendible
		ensure
			new_count: count = old count + 1
			item_inserted: first = v

	put_left (v: like item)
			-- Add v to the left of cursor position.
			-- Do not move cursor.
		require
			extendible: extendible
			not_before: not before
		ensure
			new_count: count = old count + 1
			new_index: index = old index + 1

	put_right (v: like item)
			-- Add v to the right of cursor position.
			-- Do not move cursor.
		require
			extendible: extendible
			not_after: not after
		ensure
			new_count: count = old count + 1
			same_index: index = old index

	merge_left (other: like Current)
			-- Merge other into current structure before cursor
			-- position. Do not move cursor. Empty other.
		require
			extendible: extendible
			not_before: not before
			other_exists: other /= Void
			not_current: other /= Current
		ensure
			new_count: count = old count + old other.count
			new_index: index = old index + old other.count
			other_is_empty: other.is_empty

	merge_right (other: like Current)
			-- Merge other into current structure after cursor
			-- position. Do not move cursor. Empty other.
		require
			extendible: extendible
			not_after: not after
			other_exists: other /= Void
			not_current: other /= Current
		ensure
			new_count: count = old count + old other.count
			same_index: index = old index
			other_is_empty: other.is_empty
	
feature -- Removal

	prune (v: like item)
			-- Remove first occurrence of v, if any,
			-- after cursor position.
			-- If found, move cursor to right neighbor;
			-- if not, make structure exhausted.

	prune_all (v: like item)
			-- Remove all occurrences of v.
			-- (Reference or object equality,
			-- based on object_comparison.)
			-- Leave structure exhausted.
		ensure then
			is_exhausted: exhausted

	remove_left
			-- Remove item to the left of cursor position.
			-- Do not move cursor.
		require
			left_exists: index > 1
		ensure
			new_count: count = old count - 1
			new_index: index = old index - 1

	remove_right
			-- Remove item to the right of cursor position.
			-- Do not move cursor.
		require
			right_exists: index < count
		ensure
			new_count: count = old count - 1
			same_index: index = old index

	remove_i_th (i: INTEGER_32)
			-- Remove item at index i.
			-- Move cursor to next neighbor (or after if no next neighbor) if it is at i-th position.
			-- Do not change cursor otherwise.
		ensure then
			new_count: count = old count - 1
			same_index_if_below: index <= i implies index = old index
			new_index_if_above: index > i implies index = old index - 1
			same_leading_items: across
					old twin as c
				all
					c.target_index < i implies c.item = i_th (c.target_index)
				end
			same_trailing_items: across
					old twin as c
				all
					c.target_index > i implies c.item = i_th (c.target_index - 1)
				end

	wipe_out
			-- Remove all items.
	
note
	copyright: "Copyright (c) 1984-2019, Eiffel Software and others"
	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
	source: "[
		Eiffel Software
		5949 Hollister Ave., Goleta, CA 93117 USA
		Telephone 805-685-1006, Fax 805-685-6869
		Website http://www.eiffel.com
		Customer support http://support.eiffel.com
	]"

end -- class DYNAMIC_CHAIN

Generated by ISE EiffelStudio