Skip to content

Instantly share code, notes, and snippets.

struct VariationCount
{
boost::optional<double> m_initial;
int m_count;
};
struct CountVariationBiggerThan
{
CountVariationBiggerThan(double limit) : m_limit(limit) {}
double m_limit;
template<typename Range, typename... Steps>
auto fold(Range const& rng, Steps... steps)
{
return std::accumulate(
rng.begin(), rng.end(),
std::make_tuple(steps()...),
par_steps(steps...));
}
auto read = read_stock_by_id("A");
auto res = fold(read(source),
FindMinimum<double>(),
GetAverage(),
CountVariationBiggerThan(2));
auto res = accumulate(
read(source),
std::make_tuple(
FindMinimum<double>()(),
GetAverage()(),
CountVariationBiggerThan(2)()),
par_steps(
FindMinimum<double>(),
GetAverage(),
CountVariationBiggerThan(2)));
auto to_nice_result = [](auto min, auto avg, auto big) {
return batch_result{ min, avg.m_value, big.m_count };
};
auto typed = apply(to_nice_result, fold_result);
std::cout
<< "Result summary:\n"
<< " - Minimum: " << typed.m_minimum << "\n"
<< " - Average: " << typed.m_average << "\n"
<< " - Variations: " << typed.m_variation_count << "\n";
type Id = String
data OpType = Add | Mul deriving (Show, Eq, Ord)
data Expr
= Cst Int
| Var Id
| Op OpType [Expr]
deriving (Show, Eq, Ord)
cst = Cst
var = Var
add = Op Add
mul = Op Mul
add [ cst(1)
, cst(2)
, mul [cst(0), var("x"), var("y")]
, mul [cst(1), var("y"), cst(2)]
, add [cst(0), var("x") ]]
prn :: Expr -> String
prn (Cst n) = show n
prn (Var v) = v
prn (Op Add xs) = "(+ " ++ unwords (map prn xs) ++ ")"
prn (Op Mul xs) = "(* " ++ unwords (map prn xs) ++ ")"
> let e = add [ cst(1)
, cst(2)
, mul [cst(0), var("x"), var("y")]
, mul [cst(1), var("y"), cst(2)]
, add [cst(0), var("x") ]]
> prn e
"(+ 1 2 (* 0 x y) (* 1 y 2) (+ 0 x))"