module Kredis::Types

def boolean(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def boolean(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: :boolean, default: default, expires_in: expires_in)
end

def counter(key, expires_in: nil, default: nil, config: :shared, after_change: nil)

def counter(key, expires_in: nil, default: nil, config: :shared, after_change: nil)
  type_from(Counter, config, key, after_change: after_change, default: default, expires_in: expires_in)
end

def cycle(key, values:, expires_in: nil, config: :shared, after_change: nil)

def cycle(key, values:, expires_in: nil, config: :shared, after_change: nil)
  type_from(Cycle, config, key, after_change: after_change, values: values, expires_in: expires_in)
end

def datetime(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def datetime(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: :datetime, default: default, expires_in: expires_in)
end

def decimal(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def decimal(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: :decimal, default: default, expires_in: expires_in)
end

def enum(key, values:, default:, config: :shared, after_change: nil)

def enum(key, values:, default:, config: :shared, after_change: nil)
  type_from(Enum, config, key, after_change: after_change, values: values, default: default)
end

def flag(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def flag(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Flag, config, key, after_change: after_change, default: default, expires_in: expires_in)
end

def float(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def float(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: :float, default: default, expires_in: expires_in)
end

def hash(key, typed: :string, default: nil, config: :shared, after_change: nil)

def hash(key, typed: :string, default: nil, config: :shared, after_change: nil)
  type_from(Hash, config, key, after_change: after_change, default: default, typed: typed)
end

def integer(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def integer(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: :integer, default: default, expires_in: expires_in)
end

def json(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def json(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: :json, default: default, expires_in: expires_in)
end

def limiter(key, limit:, expires_in: nil, config: :shared, after_change: nil)

def limiter(key, limit:, expires_in: nil, config: :shared, after_change: nil)
  type_from(Limiter, config, key, after_change: after_change, expires_in: expires_in, limit: limit)
end

def list(key, default: nil, typed: :string, config: :shared, after_change: nil)

def list(key, default: nil, typed: :string, config: :shared, after_change: nil)
  type_from(List, config, key, after_change: after_change, default: default, typed: typed)
end

def ordered_set(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil)

def ordered_set(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil)
  type_from(OrderedSet, config, key, after_change: after_change, default: default, typed: typed, limit: limit)
end

def proxy(key, config: :shared, after_change: nil)

def proxy(key, config: :shared, after_change: nil)
  type_from(Proxy, config, key, after_change: after_change)
end

def scalar(key, typed: :string, default: nil, config: :shared, after_change: nil, expires_in: nil)

def scalar(key, typed: :string, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: typed, default: default, expires_in: expires_in)
end

def set(key, default: nil, typed: :string, config: :shared, after_change: nil)

def set(key, default: nil, typed: :string, config: :shared, after_change: nil)
  type_from(Set, config, key, after_change: after_change, default: default, typed: typed)
end

def slot(key, config: :shared, after_change: nil)

def slot(key, config: :shared, after_change: nil)
  type_from(Slots, config, key, after_change: after_change, available: 1)
end

def slots(key, available:, config: :shared, after_change: nil)

def slots(key, available:, config: :shared, after_change: nil)
  type_from(Slots, config, key, after_change: after_change, available: available)
end

def string(key, default: nil, config: :shared, after_change: nil, expires_in: nil)

def string(key, default: nil, config: :shared, after_change: nil, expires_in: nil)
  type_from(Scalar, config, key, after_change: after_change, typed: :string, default: default, expires_in: expires_in)
end

def type_from(type_klass, config, key, after_change: nil, **options)

def type_from(type_klass, config, key, after_change: nil, **options)
  type_klass.new(configured_for(config), namespaced_key(key), **options).then do |type|
    after_change ? CallbacksProxy.new(type, after_change) : type
  end
end

def unique_list(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil)

def unique_list(key, default: nil, typed: :string, limit: nil, config: :shared, after_change: nil)
  type_from(UniqueList, config, key, after_change: after_change, default: default, typed: typed, limit: limit)
end