| -- |
| -- 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 |