blob: a765ab0e0ac05730dd555351cd1c39264b372faa [file] [log] [blame] [edit]
--
-- Copyright 2019, Data61
-- Commonwealth Scientific and Industrial Research Organisation (CSIRO)
-- ABN 41 687 119 230.
--
-- This software may be distributed and modified according to the terms of
-- the GNU General Public License version 2. Note that NO WARRANTY is provided.
-- See "LICENSE_GPLv2.txt" for details.
--
-- @TAG(DATA61_GPL)
--
include <gum/common/iterator.cogent>
include <gum/common/common.cogent>
print_string: (SysState, String) -> SysState
print_result: (SysState, U32) -> SysState
seq32_generator: #{acc: (U32, U32), obsv: U32!} -> GeneratorResult U32 () () (U32, U32)
seq32_generator #{acc = (cur_iter, acc), obsv = max_iter} =
if cur_iter > max_iter then
((cur_iter, acc), Stop ())
else
((cur_iter + 1, acc), Yield cur_iter)
sum_of_n: #{obj: U32, acc: (U32, U32), obsv: U32} -> ConsumerResult () () (U32, U32)
sum_of_n #{obj = i, acc = (cur_iter, sum), obsv = _} =
((cur_iter, (i + sum)), Next)
sum: (SysState, U32) -> Result (SysState) (SysState)
sum (st, n) =
let iter = iterate[U32, (), (), (U32, U32), U32]
and ((_, sum), r) = iter #{
gen = seq32_generator,
cons = sum_of_n,
acc = (0, 0),
obsv = n }
in r
| Return () ->
let st = print_string (st, "Error")
in Error st
| Stop () ->
let st = print_result (st, sum)
in Success st