defmodule BitcoinLib.Script.Opcodes.Arithmetic.Not do @moduledoc """ Based on https://en.bitcoin.it/wiki/Script Word OP_NOT Opcode 145 Hex 0x91 Input in Output out If the input is 0 or 1, it is flipped. Otherwise the output will be 0. """ @behaviour BitcoinLib.Script.Opcode defstruct [] alias BitcoinLib.Script.Opcodes.Arithmetic.Not @value 0x91 @doc """ Returns 0x91 ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.Not.v() 0x91 """ @spec v() :: 0x91 def v do @value end @doc """ Returns <<0x91>> ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.Not.encode() <<0x91>> """ @spec encode() :: <<_::8>> def encode() do <<@value::8>> end @doc """ If the input is 0 or 1, it is flipped. Otherwise the output will be 0. ## Examples iex> BitcoinLib.Script.Opcodes.Arithmetic.Not.execute( ...> %BitcoinLib.Script.Opcodes.Arithmetic.Not{}, ...> [1, 3, 1] ...> ) {:ok, [0, 3, 1]} """ @spec execute(%Not{}, list()) :: {:ok, list()} def execute(%Not{}, [0] ++ remaining) do {:ok, [1 | remaining]} end def execute(%Not{}, [_] ++ remaining) do {:ok, [0 | remaining]} end end