Observations from two distribution functions mixed, how to separate them?

Assume I have 100 observations, I know they are from two distribution functions, they are mixed together.

Is this possible to find out which distribution they are coming from?

Here is an example in R, 50 sample from a normal distribution, 50 sample from a uniform distribution.

set.seed(1)

a <- runif(50, min = -1, max = 1) # a is 50 sample from uniform distribution
b <- rnorm(50, mean = 0, sd = 1) # b is 50 sample form normal distribution

x <- c(a,b) # x is the mixed observation