vim script で、list をラップ

STL っぽく簡単に list をラップしてみた。
まぁこれぐらいなら素直に組み込み関数を使ったほうがいいのかな。
こういうのは需要があるのだろうか。

[ソース]

function! s:class_array(...)
    
    " 初期化
    let self = {}
    
    " プロパティ
    let self.data = a:000

    " メソッド
    function! self.to_list()
        return self.data
    endfunction

    function! self.to_string()
        return string(self.data)
    endfunction
    
    function! self.assign(list)
        let self.data = a:list
    endfunction

    function! self.size()
        return len(self.data)
    endfunction
    
    function! self.clear()
        let self.data = []
    endfunction
    
    function! self.at(number)
        return self.data[a:number]
    endfunction
    
    function! self.insert(number, value)
        let self.data[a:number] = a:value
    endfunction
    
    function! self.erase(number)
        call remove(self.data, a:number)
    endfunction

    function! self.empty()
        return empty(self.data)
    endfunction

    function! self.pop_front()
        let self.data = self.data[1 : ]
    endfunction

    function! self.push_front(value)
        let self.data = [a:value] + self.data
    endfunction

    function! self.push_back(value)
        let self.data = self.data + [a:value]
    endfunction
    
    function! self.pop_back()
        let self.data = self.data[ : self.size()-2]
    endfunction

    return self
endfunction

let array = s:class_array(0, 1, 2, 3, 4)
echo "to_list()      -> ".array.to_string()
call array.pop_front()
echo "pop_front()    -> ".array.to_string()
call array.pop_back()
echo "pop_back()     -> ".array.to_string()
call array.push_back(0)
echo "push_back(0)   -> ".array.to_string()
call array.push_front(-1)
echo "push_front(-1) -> ".array.to_string()
echo "at(3)          -> ".array.at(3)
call array.insert(3, 10)
echo "insert(3, 10)  -> ".array.to_string()
echo "size()         -> ".array.size()
call array.assign([5, 6, 2])
echo "assign([5, 6, 2]) -> ".array.to_string()

[出力]

to_list()      -> [0, 1, 2, 3, 4]
pop_front()    -> [1, 2, 3, 4]
pop_back()     -> [1, 2, 3]
push_back(0)   -> [1, 2, 3, 0]
push_front(-1) -> [-1, 1, 2, 3, 0]
at(3)          -> 3
insert(3, 10)  -> [-1, 1, 2, 10, 0]
size()         -> 5
assign([5, 6, 2]) -> [5, 6, 2]