#  File src/library/base/R/duplicated.R
#  Part of the R package, https://www.R-project.org
#
#  Copyright (C) 1995-2018 The R Core Team
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  A copy of the GNU General Public License is available at
#  https://www.R-project.org/Licenses/

duplicated <-
function(x, incomparables = FALSE, ...)
    UseMethod("duplicated")

duplicated.default <-
function(x, incomparables = FALSE, fromLast = FALSE, nmax = NA, ...)
    .Internal(duplicated(x, incomparables, fromLast,
                         if(is.factor(x)) min(length(x), nlevels(x) + 1L) else nmax))

duplicated.data.frame <-
function(x, incomparables = FALSE, fromLast = FALSE, ...)
{
    if(!isFALSE(incomparables))
	.NotYetUsed("incomparables != FALSE")
    if(length(x) != 1L) {
        if(any(i <- vapply(x, is.factor, NA)))
            x[i] <- lapply(x[i], as.numeric)
        duplicated(do.call(Map, `names<-`(c(list, x), NULL)), fromLast = fromLast)
    }
    else duplicated(x[[1L]], fromLast = fromLast, ...)
}

duplicated.matrix <- duplicated.array <-
function(x, incomparables = FALSE, MARGIN = 1L, fromLast = FALSE, ...)
{
    if(!isFALSE(incomparables))
	.NotYetUsed("incomparables != FALSE")
    dx <- dim(x)
    ndim <- length(dx)
    if (any(MARGIN > ndim))
        stop(gettextf("MARGIN = %s is invalid for dim = %s",
                      paste(MARGIN, collapse = ","),
                      paste(dx, collapse = ",")),
             domain = NA)
    temp <- if((ndim > 1L) && (prod(dx[-MARGIN]) > 1L))
                asplit(x, MARGIN)
            else x
    res <- duplicated.default(temp, fromLast = fromLast, ...)
    dim(res) <- dim(temp)
    dimnames(res) <- dimnames(temp)
    res
}

anyDuplicated <-
function(x, incomparables = FALSE, ...)
    UseMethod("anyDuplicated")

anyDuplicated.default <-
function(x, incomparables = FALSE, fromLast = FALSE, ...)
    .Internal(anyDuplicated(x, incomparables, fromLast))

anyDuplicated.data.frame <-
function(x, incomparables = FALSE, fromLast = FALSE, ...)
{
    if(!isFALSE(incomparables))
	.NotYetUsed("incomparables != FALSE")
    anyDuplicated(do.call(Map, `names<-`(c(list, x), NULL)), fromLast = fromLast)
}

anyDuplicated.matrix <- anyDuplicated.array <-
function(x, incomparables = FALSE, MARGIN = 1L, fromLast = FALSE, ...)
{
    if(!isFALSE(incomparables))
	.NotYetUsed("incomparables != FALSE")
    dx <- dim(x)
    ndim <- length(dx)
    if (any(MARGIN > ndim))
        stop(gettextf("MARGIN = %s is invalid for dim = %s",
                      paste(MARGIN, collapse = ","),
                      paste(dx, collapse = ",")),
             domain = NA)
    temp <- if((ndim > 1L) && (prod(dx[-MARGIN]) > 1L))
                asplit(x, MARGIN)
            else x
    anyDuplicated.default(temp, fromLast = fromLast)
}

unique <-
function(x, incomparables = FALSE, ...)
    UseMethod("unique")

## NB unique.default is used by factor to avoid unique.matrix,
## so it needs to handle some other cases.
unique.default <-
function(x, incomparables = FALSE, fromLast = FALSE, nmax = NA, ...)
{
    if(is.factor(x)) {
        z <- .Internal(unique(x, incomparables, fromLast,
                              min(length(x), nlevels(x) + 1L)))
 	return(factor(z, levels = seq_len(nlevels(x)), labels = levels(x),
               ordered = is.ordered(x)))
    }
    z <- .Internal(unique(x, incomparables, fromLast, nmax))
    if(inherits(x, "POSIXct"))
        structure(z, class = class(x), tzone = attr(x, "tzone"))
    else if(inherits(x, "Date"))
        structure(z, class = class(x))
    else z
}

unique.data.frame <-
function(x, incomparables = FALSE, fromLast = FALSE, ...)
{
    if(!isFALSE(incomparables))
	.NotYetUsed("incomparables != FALSE")
    x[!duplicated(x, fromLast = fromLast, ...),  , drop = FALSE]
}

unique.matrix <- unique.array <-
function(x, incomparables = FALSE, MARGIN = 1, fromLast = FALSE, ...)
{
    if(!isFALSE(incomparables))
	.NotYetUsed("incomparables != FALSE")
    dx <- dim(x)
    ndim <- length(dx)
    if (length(MARGIN) != 1L || (MARGIN > ndim))
        stop(gettextf("MARGIN = %s is invalid for dim = %s",
                      paste(MARGIN, collapse = ","),
                      paste(dx, collapse = ",")),
             domain = NA)
    temp <- if((ndim > 1L) && (prod(dx[-MARGIN]) > 1L))
                asplit(x, MARGIN)
            else x
    args <- rep(alist(a=), ndim)
    names(args) <- NULL
    args[[MARGIN]] <- !duplicated.default(temp, fromLast = fromLast, ...)
    do.call("[", c(list(x), args, list(drop = FALSE)))
}
