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

sum.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 sum
#
#  Author: Fridtjof Siebert (siebert@tokiwa.software)
#
# -----------------------------------------------------------------------

# sum -- generic sum of the elements of a Sequence of numeric.
#
# This allows summing the elements of a list, as in
#
#   l := [1,2,3]
#   say (sum l)     # '6'
#
#
sum(T (numeric T).type, l Sequence T)
  pre
    debug: !l.isEmpty   # sum does not work (yet) for empty Sequence
  =>

  # NYI: the following code to get T's sum monoid does not work for l.isEmpty,
  # it should be something like
  #
  #  l.fold T.sum
  #
  n := l.asList.forceHead
  sum0 n l


# sum0 -- generic sum of the elements of a Sequence of numeric with type parameter.
#
# This allows summing the elements of a list, as in
#
#   l := [1,2,3]
#   say (sum0 i32 l)     # '6'
#
# NYI: When we move numerics.sum to numeric.type.sum, we should not need this any longer.
#
sum0(
  # the numeric type we are summing, unit value
  U (numerics T).type,
  T (numeric T).type,
  n U,
  l Sequence T
  )
  =>
  l.fold n.sum