/*
 * NAME:	mkmapping()
 * DESCRIPTION:	create a mapping of two arrays
 */
static mapping mkmapping(mixed *indices, mixed *values)
{
    mapping map;
    int i, sz;

    ARGCHECK(indices, mkmapping, 1);
    ARGCHECK(values, mkmapping, 2);

    if (sizeof(indices) != sizeof(values)) {
	error("Unequal argument sizes in mkmapping()");
    }
    map = ([ ]);
    for (i = 0, sz = sizeof(indices); i < sz; i++) {
	map[indices[i]] = values[i];
    }

    return map;
}

/*
 * NAME:	m_indices()
 * DESCRIPTION:	return the indices of a mapping
 */
static mixed *m_indices(mapping map)
{
    ARGCHECK(map, m_indices, 1);
    return map_indices(map);
}

/*
 * NAME:	m_values()
 * DESCRIPTION:	return the values of a mapping
 */
static mixed *m_values(mapping map)
{
    ARGCHECK(map, m_values, 1);
    return map_values(map);
}

/*
 * NAME:	m_delete()
 * DESCRIPTION:	return a mapping with an element deleted
 */
static mapping m_delete(mapping map, mixed elt)
{
    ARGCHECK(map, m_delete, 1);

    map += ([ ]);
    map[elt] = 0;
    return map;
}

/*
 * NAME:	m_sizeof()
 * DESCRIPTION:	return the size of a mapping
 */
static int m_sizeof(mapping map)
{
    ARGCHECK(map, m_sizeof, 1);
    return map_sizeof(map);
}

/*
 * NAME:	filter_mapping()
 * DESCRIPTION:	filter a mapping by its values
 */
static varargs mapping
filter_mapping(mapping map, mixed func, mixed obj, mixed arg)
{
    mixed *indices, *values, value;
    mapping copy;
    int i, sz;

    ARGCHECK(map, filter_mapping, 1);
    if (closurep(func) && obj == 0 && arg == 0) {
	return relay("lambda_filter_mapping", map, func);
    }
    ARGCHECK(stringp(func), filter_mapping, 2);
    if (stringp(obj)) {
	call_other(obj, "???");
	obj = find_object(obj);
    }
    ARGCHECK(objectp(obj), filter_mapping, 3);

    indices = map_indices(map);
    values = map_values(map);
    copy = ([ ]);
    for (i = 0, sz = sizeof(indices); i < sz; i++) {
	if (call_other(obj, func, value = values[i], arg)) {
	    copy[indices[i]] = value;
	}
    }

    return copy;
}

/*
 * NAME:	map_mapping()
 * DESCRIPTION:	map the values of a mapping
 */
static varargs mapping
map_mapping(mapping map, mixed func, mixed obj, mixed arg)
{
    mixed *indices, *values;
    mapping copy;
    int i, sz;

    ARGCHECK(map, map_mapping, 1);
    if (closurep(func) && obj == 0 && arg == 0) {
	return relay("lambda_map_mapping", map, func);
    }
    ARGCHECK(stringp(func), map_mapping, 2);
    if (stringp(obj)) {
	call_other(obj, "???");
	obj = find_object(obj);
    }
    ARGCHECK(objectp(obj), map_mapping, 3);

    indices = map_indices(map);
    values = map_values(map);
    copy = ([ ]);
    for (i = 0, sz = sizeof(indices); i < sz; i++) {
	copy[indices[i]] = call_other(obj, func, values[i], arg);
    }

    return copy;
}