Last active
July 7, 2020 21:37
-
-
Save NikitaIT/ab18651361b01fe1416b6f0f6571600f to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Available variables: | |
// - Machine | |
// - interpret | |
// - assign | |
// - send | |
// - sendParent | |
// - spawn | |
// - raise | |
// - actions | |
// - XState (all XState exports) | |
const state = { | |
idle: 'idle', | |
autobinding: 'autobinding', | |
success: 'success', | |
failure: 'failure', | |
onAutobinding: 'onAutobinding', | |
offAutobinding: 'offAutobinding', | |
cpc: 'cpc', | |
cpm: 'cpm', | |
maxView: 'maxView', | |
maxClick: 'maxClick' | |
}; | |
const tt = `рекламных форматов в ленте новостей`; | |
const tt1 = `содержащих ссылку/кнопку/сниппет, за исключением записей со статьями и опросами.`; | |
const tt3 = `с оплатой за 1000 показов (CPM)`; | |
const tt4 = `рекламных форматов в ленте новостей, а также для рекламы в Историях.`; | |
const cpm = '30 < _ < 1000 rub'; | |
const cpmMax = '30 < _ < 1000 rub'; | |
const cpcMax = '0.10 < _ < 150 rub'; | |
const reqMax = '0.10 < _ < 10000 rub'; | |
// reqMax day_limit = [100..1000000000] | |
// reqMax только autobind (на обуч?) | |
// goal_type 3 cost_type 3 ad_format 9? | |
// что значит в вк редактировать форму? | |
const req = 'только для формата Сбор заявок'; | |
const subscribtion = `только для формата Запись с кнопкой. Доступные кнопки: Вступить, Подписаться, Я пойду. И сообщество, от лица которого создано объявление. И Изменить/удалить кнопку или ссылку в ней нельзя. И Сообщество, от имени которого создано объявление, по-умолчанию находится в исключениях настроек объявления, убрать его нельзя.`; | |
const subMax = '1 < _ < 500 rub'; | |
const cpc = '0.10 < _ < 150 rub'; | |
const upAutobinding = updateSingle('autobidding'); | |
const fetchMachine = Machine({ | |
id: 'fetch', | |
initial: state.cpm, | |
context: { | |
retries: 0, | |
goal_type: 1, | |
cost_type: 1, | |
cpm: 5564, | |
autobidding_max_cost: 1, | |
autobidding: 0 | |
}, | |
states: { | |
// [state.idle]: { | |
// on: { | |
// FETCH: state.loading, | |
// a: { | |
// target: state.loading, | |
// actions: assign({ | |
// goal_type: (context, event) => context.goal_type = 2 | |
// }) | |
// }, | |
// } | |
// }, | |
[state.cpm]: { | |
on: { | |
update: { | |
target: state.cpm, | |
cond: { type: cpm } | |
}, | |
onAutobinding: { | |
target: state.onAutobinding, | |
actions: upAutobinding(1) | |
} | |
} | |
}, | |
[state.cpc]: { | |
on: { | |
update: { | |
target: state.cpc, | |
cond: { type: cpc } | |
}, | |
cpm: state.cpm, | |
activities: ['activateCrosswalkLight'], | |
} | |
}, | |
[state.onAutobinding]: { | |
on: { | |
view: [ | |
{ | |
target: state.maxView, | |
cond: { type: tt3 } | |
}, | |
{ | |
target: state.maxView, | |
cond: { type: tt4 } | |
}, | |
], | |
click: [ | |
{ | |
target: state.maxClick, | |
cond: { type: tt } | |
}, | |
{ | |
target: state.maxClick, | |
cond: { type: tt1 } | |
}, | |
], | |
'вступления': { | |
target: 'за вступления', | |
cond: { type: subscribtion }, | |
}, | |
'заявки': { | |
target: 'за заявки', | |
cond: { type: req }, | |
}, | |
day_limit: state.onAutobinding, | |
off: { | |
target: state.offAutobinding, | |
actions: upAutobinding(0) | |
} | |
} | |
}, | |
'за вступления': { // подписки | |
on: { | |
// cpm = auto | |
// платишь за cpm | |
// период обучения? | |
// у их dl для выхода из локального максимума | |
// нужно добавить 1-5 rub | |
// у их dl функция максимизации, по этому | |
// надо ставить ниже желаемой | |
next: state.onAutobinding, | |
update: [ | |
{ | |
target: 'за вступления', | |
cond: { type: subMax } | |
} | |
], | |
}, | |
}, | |
'за заявки': { | |
// cpm = auto | |
// платишь за cpm | |
// период обучения? | |
on: { | |
next: state.onAutobinding, | |
update: [ | |
{ | |
target: 'за заявки', | |
cond: { type: reqMax } | |
} | |
], | |
}, | |
}, | |
[state.maxView]: { | |
on: { | |
next: state.onAutobinding, | |
update: [ | |
{ | |
target: state.maxView, | |
cond: { type: cpmMax } | |
} | |
], | |
}, | |
}, | |
[state.maxClick]: { | |
// платишь за cpm | |
on: { | |
next: state.onAutobinding, | |
update: [ | |
{ | |
target: state.maxClick, | |
cond: { type: cpcMax } | |
} | |
], | |
}, | |
}, | |
[state.offAutobinding]: { | |
on: { | |
cpm: state.cpm, | |
cpc: state.cpc, | |
on: { | |
target: state.onAutobinding, | |
actions: upAutobinding(1) | |
} | |
} | |
}, | |
// [state.success]: { | |
// type: 'final' | |
// }, | |
} | |
}, | |
{ | |
guards: { | |
[tt]: (context, event) => true, | |
[tt1]: (context, event) => true, | |
[cpm]: (context, event) => true, | |
[cpc]: (context, event) => true, | |
[cpmMax]: (context, event) => true, | |
[cpcMax]: (context, event) => true, | |
[req]: (context, event) => true, | |
[reqMax]: (context, event) => true, | |
[subscribtion]: (context, event) => true, | |
[subMax]: (context, event) => true, | |
} | |
}); | |
function updateSingle(prop) { | |
return (value) => assign({ | |
[prop]: (context, event) => context[prop] = value | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment