Class DS_BILINKABLE |

    indexing

>     description:

>         "Linkable cells with a reference to their left and right neighbors"

>     library:    "Gobo Eiffel Structure Library"
>     author:     "Eric Bezault <ericb@gobosoft.com>"
>     copyright:  "Copyright (c) 1999, Eric Bezault and others"
>     license:    "Eiffel Forum License v2 (see forum.txt)"

    class interface

>     DS_BILINKABLE [G]

    inherit

>     DS_LINKABLE [G]
>         DS_CELL [G]

    creation

>     make (v: G)
>             -- Insert v in cell.
>             -- (From DS_CELL.)
>         ensure
>             inserted: item = v

    feature -- Access

>     item: G
>             -- Content of cell
>             -- (From DS_CELL.)

>     right: like Current
>             -- Right neighbor
>             -- (From DS_LINKABLE.)

>     left: like Current
>             -- Left neighbor

    feature -- Element change

>     put, make (v: G)
>             -- Insert v in cell.
>             -- (From DS_CELL.)
>         ensure
>             inserted: item = v

>     put_right (other: like Current)
>             -- Put other to right of cell.
>             -- Make sure that link is bidirectional.
>             -- (From DS_LINKABLE.)
>         require
>             other_not_void: other /= Void
>         ensure
>             linked: right = other
>             bilinked: other.left = Current

>     put_left (other: like Current)
>             -- Put other to left of cell.
>             -- Make sure that link is bidirectional.
>         require
>             other_not_void: other /= Void
>         ensure
>             linked: left = other
>             bilinked: other.right = Current

>     forget_right
>             -- Remove right neighbor.
>             -- (From DS_LINKABLE.)
>         ensure
>             forgotten: right = Void

>     forget_left
>             -- Remove left neighbor.
>         ensure
>             forgotten: left = Void

    end -- class DS_BILINKABLE