Skip to content

Instantly share code, notes, and snippets.

@a-x-
Last active July 30, 2016 16:27
Show Gist options
  • Select an option

  • Save a-x-/3b5e6dfe15f74b5f843f87a20f090b2f to your computer and use it in GitHub Desktop.

Select an option

Save a-x-/3b5e6dfe15f74b5f843f87a20f090b2f to your computer and use it in GitHub Desktop.
Operations on maybe types transport

https://twitter.com/mxtnr/status/759409328956776448

Родилась интересная концепция, которая лучше всего может заработать в ФП-языках (но применимо и в таких языках как js).

Пример: есть блок popup2 с параметром mainOffset и дефолтным значением 5, если задан параметр theme=normal, иначе 0

И есть блок tooltip, который композируются над popup2.
Если задан параметр блока tooltip tail: false, он увеличивает mainOffset на 5 Но если mainOffset не задан, то tooltip не знает, что делать.

Приходится копипастить логику про дефолт, а это ужасно.
Ответственность за дефолты должна лежать только на последних звеньях цепи и не должна дублироваться.
Если дефолт поменяется, гарантированно, возникнет неявный баг.

Псевдокод valop

Концепция предлагает посылать не просто, условно, Maybe<T>, а например ValOp<Maybe<T>,T> (или более строго и обощённо: ValOp<Maybe<T>, Operator T) и реализовывать полиморфный popup2, принимающий и Maybe<T>, и ValOp<Maybe<T>,T>.

Примеры вызовов:

tooltip(mainOffset=undefined, tail = false, theme = normal)
// -> popup2(ValOp(undefined, +5), theme = normal) // -> mainOffset == 10

tooltip(mainOffset=10, tail = false, theme = normal)
// -> popup2(ValOp(10, +5), theme = normal) // -> mainOffset == 15

tooltip(mainOffset=20, theme = normal)
// -> popup2(ValOp(20, +0), theme = normal) // -> mainOffset == 20

tooltip(mainOffset=undefined, tail = false, theme = action)
// -> popup2(ValOp(undefined, +5), theme = action) // -> mainOffset == 5

tooltip(mainOffset=20, theme = action)
// -> popup2(ValOp(20, +0), theme = action) // -> mainOffset == 20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment