Utility methods
Summary
Functions
true if the datetime is close to (+/- 5 mins) from now
realises a datetime from now conforming to the summary
Deletes map value if empty []
Ensures value in map is not nil. If existing and replacement value both nil removes key
Extracts value from map in list of tuples, and sets if not nil ## Examples iex> duration = Duration.new!(month: 1) iex> list = [duration: duration] iex> tl(Diffo.Util.extract_suppress(list, :duration, :month, :months)) [months: 1]
Encapsulate a tuple value as a Jason Fragment ## Examples iex> list = [state: :initial, service: Jason.encode!(%{state: :initial})] iex> list = Diffo.Util.fragment(list, :service) iex> {:service, %name{}} = List.keyfind(list, :service, 0) iex> name Jason.Fragment
true if the datetime is future, more than 5 mins after now
Gets a value from a list of tuples, or nil
Nest values from list of tuples into a list, with a new tuple key ## Examples iex> list = [state: :up, weeks: 1, days: 5] iex> Diffo.Util.nest(list, [:weeks, :days], :duration) [state: :up, duration: [weeks: 1, days: 5]]
Nest values from list of tuples into a map, with a new tuple key ## Examples iex> list = [state: :up, weeks: 1, days: 5] iex> Diffo.Util.nest_as_map(list, [:weeks, :days], :duration) [state: :up, duration: %{weeks: 1, days: 5}]
true if the datetime is past, more than 5 mins before now ## Examples iex> Diffo.Util.past?(DateTime.utc_now() |> DateTime.shift(minute: -6)) true
Adds value to map if not empty []
Removes a tuple from a list of tuples ## Examples iex> list = [a: [], b: [1], c: nil] iex> Diffo.Util.remove(list, :a) [b: [1], c: nil] iex> Diffo.Util.remove(list, :b) [a: [], c: nil] iex> Diffo.Util.remove(list, :c) [a: [], b: [1]] iex> Diffo.Util.remove(list, :d) [a: [], b: [1], c: nil]
Renames a tuple in a list, preserving its value and position ## Examples iex> list = [a: 1, b: 2, d: 3] iex> Diffo.Util.rename(list, :b, :c) [a: 1, c: 2, d: 3] iex> Diffo.Util.rename(list, :c, :e) [a: 1, b: 2, d: 3] iex> Diffo.Util.rename(list, :b, nil) [a: 1, d: 3]
Renames map key, unless old value is empty
Adds a tuple or updates the existing tuple value in a list of tuples
summarize datetimes in relation to now
Summarise ISO8601 dates, by comparing them with now, in a payload
Suppresses a tuple from a list of tuples if nil or empty ## Examples iex> list = [a: [], b: [1], c: nil] iex> Diffo.Util.suppress(list, :a) [b: [1], c: nil] iex> Diffo.Util.suppress(list, :b) [a: [], b: [1], c: nil] iex> Diffo.Util.suppress(list, :c) [a: [], b: [1]] iex> Diffo.Util.suppress(list, :d) [a: [], b: [1], c: nil]
Suppresses or renames, using suppress |> rename ## Examples iex> list = [a: [], b: [1], c: nil] iex> Diffo.Util.suppress_rename(list, :a, :d) [b: [1], c: nil]
Convert a dateime to iso8601, with millisecond resolution
Functions
true if the datetime is close to (+/- 5 mins) from now
Examples
iex> Diffo.Util.close_to_now?(DateTime.utc_now() |> DateTime.shift(minute: 4)) true
iex> Diffo.Util.close_to_now?(DateTime.utc_now() |> DateTime.shift(minute: -4)) true
iex> Diffo.Util.close_to_now?(DateTime.utc_now() |> DateTime.shift(minute: 6)) false
iex> Diffo.Util.close_to_now?(DateTime.utc_now() |> DateTime.shift(minute: -6)) false
realises a datetime from now conforming to the summary
Examples
iex> datetime = Diffo.Util.datetime(:now) iex> Diffo.Util.summarise(datetime) :now
iex> datetime = Diffo.Util.datetime(:future) iex> Diffo.Util.summarise(datetime) :future
iex> datetime = Diffo.Util.datetime(:past) iex> Diffo.Util.summarise(datetime) :past
Deletes map value if empty []
Examples
iex> Diffo.Util.delete_if_empty(%{serviceCharacteristic: [%{name: :port, value: 1}]}, :serviceCharacteristic) %{serviceCharacteristic: [%{name: :port, value: 1}]}
iex> Diffo.Util.delete_if_empty(%{serviceCharacteristic: []}, :serviceCharacteristic) %{}
Ensures value in map is not nil. If existing and replacement value both nil removes key
Examples
iex> Diffo.Util.ensure_not_nil(%{}, :category, :connectivity) %{category: :connectivity}
iex> Diffo.Util.ensure_not_nil(%{category: :connectivity}, :category, :physical) %{category: :physical}
iex> Diffo.Util.ensure_not_nil(%{category: :connectivity}, nil, :physical) %{category: :connectivity}
iex> Diffo.Util.ensure_not_nil(%{category: :connectivity}, :category, nil) %{}
Extracts value from map in list of tuples, and sets if not nil ## Examples iex> duration = Duration.new!(month: 1) iex> list = [duration: duration] iex> tl(Diffo.Util.extract_suppress(list, :duration, :month, :months)) [months: 1]
Encapsulate a tuple value as a Jason Fragment ## Examples iex> list = [state: :initial, service: Jason.encode!(%{state: :initial})] iex> list = Diffo.Util.fragment(list, :service) iex> {:service, %name{}} = List.keyfind(list, :service, 0) iex> name Jason.Fragment
true if the datetime is future, more than 5 mins after now
Examples
iex> Diffo.Util.future?(DateTime.utc_now() |> DateTime.shift(minute: 6)) true
iex> Diffo.Util.future?(DateTime.utc_now() |> DateTime.shift(minute: 4)) false
Gets a value from a list of tuples, or nil
Examples
iex> list = [a: 1, b: 2] iex> Diffo.Util.get(list, :b) 2 iex> Diffo.Util.get(list, :c) nil
Nest values from list of tuples into a list, with a new tuple key ## Examples iex> list = [state: :up, weeks: 1, days: 5] iex> Diffo.Util.nest(list, [:weeks, :days], :duration) [state: :up, duration: [weeks: 1, days: 5]]
Nest values from list of tuples into a map, with a new tuple key ## Examples iex> list = [state: :up, weeks: 1, days: 5] iex> Diffo.Util.nest_as_map(list, [:weeks, :days], :duration) [state: :up, duration: %{weeks: 1, days: 5}]
true if the datetime is past, more than 5 mins before now ## Examples iex> Diffo.Util.past?(DateTime.utc_now() |> DateTime.shift(minute: -6)) true
iex> Diffo.Util.past?(DateTime.utc_now() |> DateTime.shift(minute: -4)) false
Adds value to map if not empty []
Examples
iex> Diffo.Util.put_not_empty(%{}, :serviceCharacteristic, [%{name: :port, value: 1}]) %{serviceCharacteristic: [%{name: :port, value: 1}]}
iex> Diffo.Util.put_not_empty(%{}, :key, []) %{}
iex> Diffo.Util.put_not_empty(%{}, nil, [%{name: :port, value: 1}]) %{}
Removes a tuple from a list of tuples ## Examples iex> list = [a: [], b: [1], c: nil] iex> Diffo.Util.remove(list, :a) [b: [1], c: nil] iex> Diffo.Util.remove(list, :b) [a: [], c: nil] iex> Diffo.Util.remove(list, :c) [a: [], b: [1]] iex> Diffo.Util.remove(list, :d) [a: [], b: [1], c: nil]
Renames a tuple in a list, preserving its value and position ## Examples iex> list = [a: 1, b: 2, d: 3] iex> Diffo.Util.rename(list, :b, :c) [a: 1, c: 2, d: 3] iex> Diffo.Util.rename(list, :c, :e) [a: 1, b: 2, d: 3] iex> Diffo.Util.rename(list, :b, nil) [a: 1, d: 3]
Renames map key, unless old value is empty
Examples
iex> Diffo.Util.rename_ensure_not_empty(%{characteristic: [%{name: :port, value: 1}]}, :characteristic, :serviceCharacteristic) %{serviceCharacteristic: [%{name: :port, value: 1}]}
iex> Diffo.Util.rename_ensure_not_empty(%{characteristic: []}, :characteristic, :serviceCharacteristic) %{}
iex> Diffo.Util.rename_ensure_not_empty(%{}, :characteristic, :serviceCharacteristic) %{}
Adds a tuple or updates the existing tuple value in a list of tuples
Examples
iex> list = [a: 1, b: 2] iex> Diffo.Util.set(list, :c, 3) [a: 1, b: 2, c: 3] iex> Diffo.Util.set(list, :b, 3) [a: 1, b: 3] iex> Diffo.Util.set(list, :c, nil) [a: 1, b: 2] iex> Diffo.Util.set(list, :b, nil) [a: 1] iex> Diffo.Util.set(list, :c, []) [a: 1, b: 2] iex> Diffo.Util.set(list, :b, []) [a: 1]
summarize datetimes in relation to now
Examples
iex> Diffo.Util.summarise(DateTime.utc_now() |> DateTime.shift(minute: 4)) :now
iex> Diffo.Util.summarise(DateTime.utc_now() |> DateTime.shift(minute: -4)) :now
iex> Diffo.Util.summarise(DateTime.utc_now() |> DateTime.shift(minute: 6)) :future
iex> Diffo.Util.summarise(DateTime.utc_now() |> DateTime.shift(minute: -6)) :past
Summarise ISO8601 dates, by comparing them with now, in a payload
Examples
iex> now = DateTime.utc_now() iex> future = DateTime.shift(now, minute: 6) iex> past = DateTime.shift(now, minute: -6) iex> payload = Diffo.Util.to_iso8601(past) <> "," <> Diffo.Util.to_iso8601(now) <> "," <> Diffo.Util.to_iso8601(future) iex> Diffo.Util.summarise_dates(payload) "past,now,future"
Suppresses a tuple from a list of tuples if nil or empty ## Examples iex> list = [a: [], b: [1], c: nil] iex> Diffo.Util.suppress(list, :a) [b: [1], c: nil] iex> Diffo.Util.suppress(list, :b) [a: [], b: [1], c: nil] iex> Diffo.Util.suppress(list, :c) [a: [], b: [1]] iex> Diffo.Util.suppress(list, :d) [a: [], b: [1], c: nil]
Suppresses or renames, using suppress |> rename ## Examples iex> list = [a: [], b: [1], c: nil] iex> Diffo.Util.suppress_rename(list, :a, :d) [b: [1], c: nil]
iex> list = [a: [1], b: [1], c: nil] iex> Diffo.Util.suppress_rename(list, :a, :d) [d: [1], b: [1], c: nil] iex> Diffo.Util.suppress_rename(list, :a, nil) [b: [1], c: nil]
Convert a dateime to iso8601, with millisecond resolution