61 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// This file is part of Desktop App Toolkit,
 | 
						|
// a set of libraries for developing nice desktop applications.
 | 
						|
//
 | 
						|
// For license and copyright information please follow this link:
 | 
						|
// https://github.com/desktop-app/legal/blob/master/LEGAL
 | 
						|
//
 | 
						|
#pragma once
 | 
						|
 | 
						|
namespace ph {
 | 
						|
 | 
						|
struct now_t {
 | 
						|
};
 | 
						|
 | 
						|
inline constexpr auto now = now_t();
 | 
						|
 | 
						|
struct I {
 | 
						|
	QString operator()(const QString &value) const { return value; };
 | 
						|
};
 | 
						|
 | 
						|
template <typename P>
 | 
						|
using Result = decltype(std::declval<P>()(QString()));
 | 
						|
 | 
						|
struct phrase {
 | 
						|
	phrase(const QString &initial);
 | 
						|
	template <std::size_t Size>
 | 
						|
	phrase(const char (&initial)[Size])
 | 
						|
	: phrase(QString::fromUtf8(initial, Size - 1)) {
 | 
						|
	}
 | 
						|
	explicit phrase(rpl::producer<QString> initial);
 | 
						|
 | 
						|
	template <typename P = I, typename = Result<P>>
 | 
						|
	Result<P> operator()(ph::now_t, P p = P()) const {
 | 
						|
		return p(value.current());
 | 
						|
	};
 | 
						|
	template <typename P = I, typename = Result<P>>
 | 
						|
	rpl::producer<Result<P>> operator()(P p = P()) const {
 | 
						|
		return value.value() | rpl::map(p);
 | 
						|
	};
 | 
						|
 | 
						|
	rpl::variable<QString> value;
 | 
						|
};
 | 
						|
 | 
						|
now_t start_phrase_count();
 | 
						|
now_t check_phrase_count(int count);
 | 
						|
 | 
						|
namespace details {
 | 
						|
 | 
						|
template <int Count>
 | 
						|
using phrase_value_array = std::array<
 | 
						|
	std::pair<not_null<phrase*>, rpl::producer<QString>>,
 | 
						|
	Count>;
 | 
						|
 | 
						|
template <std::size_t Count>
 | 
						|
void set_values(phrase_value_array<Count> &&data) {
 | 
						|
	for (auto &[single, value] : data) {
 | 
						|
		single->value = std::move(value);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
} // namespace details
 | 
						|
} // namespace ph
 |