Fuzion Logo
flang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

InitArray.fz


# This file is part of the Fuzion language implementation.
#
# The Fuzion language implementation is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation, version 3 of the License.
#
# The Fuzion language implementation is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
# License for more details.
#
# You should have received a copy of the GNU General Public License along with The
# Fuzion language implementation.  If not, see <https://www.gnu.org/licenses/>.


# -----------------------------------------------------------------------
#
#  Tokiwa Software GmbH, Germany
#
#  Source code of Fuzion standard library feature InitArray
#
#  Author: Fridtjof Siebert (siebert@tokiwa.software)
#
# -----------------------------------------------------------------------

# InitArray -- convenience feature for array creation
#
# NYI: Replace by better syntactic sugar in the Fuzion parser / front end.
InitArray<T> is

  Nil is
  node (head T, tail list) ref is

    setTail(t list) is
      set tail := t

  list : choice<Nil, node> is

  first list := Nil
  last list := Nil
  len i32 := 0

  infix + (v T) InitArray<T>
  post
    true # NYI: len == old len + 1
  is
    nju := node(v, Nil)
    match (last)
      Nil    => set first := nju; set last := nju
      n node => n.setTail(nju);   set last := nju
    set len := len + 1
    InitArray.this

  postfix & array<T> is
    array<T> len (i ->
      match (first)
        n node =>
          set first := n.tail
          n.head
        Nil => dummy
      )

  dummy T is (InitArray.this &)[0]