Skip to content

andrewtimberlake/shorthand

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Shorthand

Shorthand provides macros to create or match against maps and keyword lists with atom or string-based keys.

Installation

Add shorthand as a dependency in your project in your mix.exs file:

def deps do
  [
    {:shorthand, "~> 1.0"}
  ]
end

Usage

Wherever you would use a map literal, you can use the shorthand macros instead, whether in assignment or as a pattern.

%{conn: conn} can become m(conn).

%{params: %{"email" => email, "password" => password}} can become m(params: sm(email, password)).

%{foo: _foo} can become m(_foo).

%{foo: ^foo} can become m(^foo).

You can specify the variable name for the key you are destructuring along with shorthand keys, but like normal function calls, they work as keyword lists at the end.

%{foo: foo, bar: bor, baz: qux} can become m(foo, bar, baz: qux)

%{foo: bar, baz: baz, qux: qux} would need to become m(baz, qux, foo: bar)

See the docs for more examples

Atom keyed maps

Shorthand Equivalent Elixir
m(foo, bar) %{foo: foo, bar: bar}
m(foo, _bar, ^baz) %{foo: foo, bar: _bar, baz: ^baz}
m(foo, bar, baz: m(qux)) %{foo: foo, bar: bar, baz: %{qux: qux}}
m(foo, m(baz) = bar, qux: m(quux)) %{foo: foo, bar: %{baz: baz} = bar, qux: %{quux: quux}}
m(foo, bar = m(baz), qux: m(quux)) %{foo: foo, bar: %{baz: baz} = bar, qux: %{quux: quux}}

String keyed maps

Shorthand Equivalent Elixir
sm(foo, bar) %{"foo" => foo, "bar" => bar}
sm(foo, _bar, ^baz) %{"foo" => foo, "bar" => _bar, "baz" => ^baz}
sm(foo, bar, baz: sm(qux)) %{"foo" => foo, "bar" => bar, "baz" => %{"qux" => qux}}
sm(foo, sm(baz) = bar, qux: sm(quux)) %{"foo" => foo, "bar" => %{"baz" => baz} = bar, "qux" => %{"quux" => quux}}
sm(foo, bar = sm(baz), qux: sm(quux)) %{"foo" => foo, "bar" => %{"baz" => baz} = bar, "qux" => %{"quux" => quux}}

Keyword lists

Shorthand Equivalent Elixir
kw(foo, bar) [foo: foo, bar: bar]
kw(foo, _bar, ^baz) [foo: foo, bar: _bar, baz: ^baz]
kw(foo, bar, baz: kw(qux)) [foo: foo, bar: bar, baz: [qux: qux]]
kw(foo, kw(baz) = bar, qux: kw(quux)) [foo: foo, bar: [baz: baz] = bar, qux: [quux: quux]]
kw(foo, bar = kw(baz), qux: kw(quux)) [foo: foo, bar: [baz: baz] = bar, qux: [quux: quux]]

Structs

Shorthand Equivalent Elixir
st(MyStruct, foo, bar) %MyStruct{foo: foo, bar: bar}
st(MyStruct, foo, _bar, ^baz) %MyStruct{foo: foo, bar: _bar, baz: ^baz}
st(MyStruct, foo, bar, baz: st(MyStruct, qux)) %MyStruct{foo: foo, bar: bar, baz: %MyStruct{qux: qux}}
st(MyStruct, foo, m(baz) = bar, qux: m(quux)) %MyStruct{foo: foo, bar: %{baz: baz} = bar, qux: %{quux: quux}}
st(MyStruct, foo, bar = m(baz), qux: m(quux)) %MyStruct{foo: foo, bar: %{baz: baz} = bar, qux: %{quux: quux}}

About

Convenience macros to eliminate laborious typing.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages