package main

import (
	"fmt"
	"time"
)

func main() {

	go testRemoveDuplicates()

	time.Sleep(1 * time.Second)

	/*
		channel := make(chan int)
		go task(channel, 7)
		fmt.Println(<-channel)
	*/

	/*
		channel := make(chan string, 5)
		var testString string = "hello"
		go task2(channel, testString)
	*/

}

func channelTest1() {

	// time.Sleep(1 * time.Second)

	// channel := make(chan int)

	// отправка данных в канал
	// channel <- num

	// получение данных из канала
	// num = <- channel

	// чтение данных из канала может происходить в цикле
	// Цикл будет продолжаться до тех пор пока канал не будет закрыт.
	/*
		for v := range channel {
			// обработка данных
		}
	*/

	// close(channel)

	// c := make(chan int, 1) // Канал с буфером размера 1
	// fmt.Println(len(c), cap(c))	// 0 1
	// c <- 1
	// fmt.Println(len(c), cap(c)) // 1 1
	// <-c

	// pipe := make(chan int)	// Небуферизованный канал
	// pipe := make(chan int, 0)	// Небуферизованый канал с ёмкостью 0
	// pipe := make(chan int, 5) // Буферизованный канал с ёикостью 5

	// channel := make(chan string, 3) // Канал с буфером на 3 строки
	// channel <- "A"
	// fmt.Println(<-channel) // Извлекаем элемент из канала

}

func channelTest2() {
	c := make(chan int, 5)
	for i := 0; i < 5; i++ {
		go myFunc(c)
	}
	time.Sleep(1 * time.Second)
	// fmt.Println("adafsdf")
	fmt.Print(<-c)
}

func myFunc(c chan int) {
	c <- cap(c)
	// fmt.Println(cap(c))
}

func task(c chan int, n int) {
	c <- n + 1
}

func task2(c chan string, s string) {
	for i := 0; i < 5; i++ {
		c <- s + " "
	}
}

func testRemoveDuplicates() {
	inputStream := make(chan string, 5)
	outputStream := make(chan string, 5)

	go removeDuplicates(inputStream, outputStream)

	inputStream <- "a"
	inputStream <- "a"
	inputStream <- "b"
	inputStream <- "a"
	inputStream <- "c"
	close(inputStream)

	fmt.Println(<-outputStream)
	fmt.Println(<-outputStream)

}

func removeDuplicates(inputStream chan string, outputStream chan string) {
	var oldString string
	for value := range inputStream {
		if oldString != value {
			outputStream <- value
			oldString = value
		}
	}

	defer func() {
		close(outputStream)
	}()
}
