Red.git | lib/MetamodelX/Red/ | Supply.rakumod
use Red::Model;
use Red::DB;
unit role MetamodelX::Red::Supply;
method last-state-of(::Model Red::Model:U \model, Supply $supply) {
my Supplier $s .= new;
multi update(Model:D $model) {
try {
$model.^saved-on-db;
$model.^clean-up-columns: $model.^id;
$model.^save;
}
# TODO: Generalise
my %row = get-RED-DB.execute("SELECT changes() as changes;").row;
unless %row<changes> {
$model.^not-on-db;
$model.^save;
}
$s.emit: $model
}
multi update(%model) {
update Model.new: |%model;
}
$supply.tap: &update;
$s.Supply
}
method transformed-state-of(::Model Red::Model:U \model, Supply $supply, &func) {
my Supplier $s .= new;
multi agg(Model:D $model) {
try $model.^all.map(&func.assuming: *, $model).save;
# TODO: Generalise
my %row = get-RED-DB.execute("SELECT changes() as changes;").row;
unless %row<changes> {
$model.^not-on-db;
$model.^save;
}
$s.emit: $model.^all.head
}
multi agg(%model) {
agg Model.new: |%model;
}
$supply.tap: &agg;
$s.Supply
}