defmodule BitcoinLib.Script.Opcodes.Arithmetic.Min do @moduledoc """ Based on https://en.bitcoin.it/wiki/Script Word OP_MIN Opcode 163 Hex 0xa3 Input a b Output out Returns the smaller of a and b. """ @behaviour BitcoinLib.Script.Opcode defstruct [] alias BitcoinLib.Script.Opcodes.Arithmetic.Min @value 0xA3 @doc """ Returns 0xa3 ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.Min.v() 0xa3 """ @spec v() :: 0xA3 def v do @value end @doc """ Returns <<0xa3>> ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.Min.encode() <<0xa3>> """ @spec encode() :: <<_::8>> def encode() do <<@value::8>> end @doc """ Returns the smaller of a and b. ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.Min.execute( ...> %BitcoinLib.Script.Opcodes.Arithmetic.Min{}, ...> [2, 3, 1] ...> ) {:ok, [2, 1]} """ @spec execute(%Min{}, list()) :: {:ok, list()} def execute(%Min{}, [first, second] ++ remaining) do min = Enum.min([first, second]) {:ok, [min] ++ remaining} end end