Skip to content

Instantly share code, notes, and snippets.

View soxjke's full-sized avatar

Petro Korienev soxjke

View GitHub Profile
@soxjke
soxjke / config-destination.ts
Last active March 31, 2021 11:57
Discriminated union
import { DestinationType, IBoxData, IWifiData, IWifiTypeData, SocialMediaItem } from '../../types/config/destination';
export interface BaseDestinationConfigg {
readonly type: DestinationType;
readonly id: string;
readonly title: string;
readonly tooltip: string;
}
interface CallDestinationConfigg extends BaseDestinationConfigg {
@soxjke
soxjke / main.swift
Created April 26, 2020 15:21
InvertBinaryTree(Leetcode)
/**
* Definition for a binary tree node.
* public class TreeNode {
* public var val: Int
* public var left: TreeNode?
* public var right: TreeNode?
* public init(_ val: Int) {
* self.val = val
* self.left = nil
* self.right = nil
@soxjke
soxjke / Task.md
Last active April 9, 2020 10:28
Test task

Test assignment description

Hi!

You're proposed to create simple grocery shopping cart application with two screens:

  • Shop catalog screen
  • Shopping cart screen

Application communicates with API server located at http://13.48.127.170:3000/ and performs few operations (described below in API section). Prelimiary application designs can be found here:

  • PNG screens:
@soxjke
soxjke / main.swift
Created March 20, 2020 10:39
DispatchQueue.recursiveSync
extension DispatchQueue {
private struct Const {
static let rSyncKey = DispatchSpecificKey<NSString>()
}
var recursiveSyncEnabled: Bool {
set { self.setSpecific(key: Const.rSyncKey, value: newValue ? (label as NSString) : nil)}
get { self.getSpecific(key: Const.rSyncKey) != nil }
}
func recursiveSync(_ closure: @escaping () -> ()) {
let specific = DispatchQueue.getSpecific(key: Const.rSyncKey)
public class Debouncer<T: Equatable> {
private(set) var value: T?
private var valueTimestamp: Date = Date()
private var interval: TimeInterval
private var queue: DispatchQueue
private var callbacks: [(T) -> ()] = []
private var debounceWorkItem: DispatchWorkItem = DispatchWorkItem {}
public init(_ interval: TimeInterval,
on queue: DispatchQueue = .main) {
private(set) var searchTermThrottle = Throttler<String>(1.5)
override func viewDidLoad() {
super.viewDidLoad()
searchField.addTarget(self, action: #selector(textDidChange(_:)), for: .editingChanged)
searchTermThrottle.on { (searchTerm) in
GithubAPI.search(term: searchTerm) { [weak self] result in
switch (result) {
case .success(let models): self?.onSuccess(models)
case .failure(let error): self?.onError(error)
import Foundation
public class Throttler<T> {
private(set) var value: T? = nil
private var valueTimestamp: Date? = nil
private var interval: TimeInterval
private var queue: DispatchQueue
private var callbacks: [(T) -> ()] = []
public init(_ interval: TimeInterval, on queue: DispatchQueue = .main) {
self.interval = interval
private var valueTimestamp: Date? = nil
private let interval: TimeInterval = 1.5
...
@objc func textDidChange(_ sender: UITextField) {
searchTerm = sender.text ?? ""
if let valueTimestamp = valueTimestamp {
if Date().timeIntervalSince(valueTimestamp) > interval {
self.valueTimestamp = nil
import UIKit
class ViewController: UIViewController {
private(set) var data: [GithubAPI.Response.Model] = []
private(set) var searchTerm: String = ""
@IBOutlet private var tableView: UITableView!
@IBOutlet private var searchField: UITextField!
@IBOutlet private var errorLabel: UILabel!
override func viewDidLoad() {
@soxjke
soxjke / main.swift
Created November 28, 2019 14:41
Arabic-2-Roman
extension Int {
enum RomanDigits: Int, CaseIterable {
case I = 1
case IV = 4
case V = 5
case IX = 9
case X = 10
case XL = 40
case L = 50
case XC = 90