Skip to content

Instantly share code, notes, and snippets.

View banjun's full-sized avatar

banjun banjun

View GitHub Profile
@banjun
banjun / WindowCapture.swift
Last active January 31, 2024 18:44
specific window capture implementation memo for https://github.com/mzp/HeartVoice
import Cocoa
import CoreGraphics
import Vision
struct TargetWindow {
let id: CGWindowID
let bounds: CGRect
init?(appName: String, windowTitle: String) {
guard let windows = CGWindowListCopyWindowInfo(.optionAll, kCGNullWindowID) as? [[String: Any]] else { return nil }
// inspection whether repdocuces or not, SR-2750
// devxoul/Then a.k.a. `.then`
// banjun/ikemen a.k.a. `※`
func testWithTypeAnnotation() {
let user = User().then {
$0. // success completion
}
}
@banjun
banjun / SignalProducerFromFuture.swift
Created February 21, 2018 00:57
create SignalProducer that create Future with the autoclosure on start and send a result to the inner observer
extension SignalProducer {
// create SignalProducer that create Future with the autoclosure on start and send a result to the inner observer
init(_ future: @escaping @autoclosure () -> Future<Value, Error>) {
self.init { observer, _ in
future()
.onSuccess {
observer.send(value: $0)
observer.sendCompleted()}
.onFailure {
observer.send(error: $0)}

Keybase proof

I hereby claim:

  • I am banjun on github.
  • I am banjun (https://keybase.io/banjun) on keybase.
  • I have a public key ASCKLh62-ATKJawCqVs88yAl7RXvjVxgeGpW0T1LsZnF8Ao

To claim this, I am signing this object:

@banjun
banjun / ViewController.swift
Created November 3, 2017 03:43
list AVCaptureDevice including iOSScreenCaptureAssistant
import Cocoa
import CoreMediaIO
import AVFoundation
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
var prop = CMIOObjectPropertyAddress(
mSelector: CMIOObjectPropertySelector(kCMIOHardwarePropertyAllowScreenCaptureDevices),
@banjun
banjun / Xcode9TableViewControllerSubclass.swift
Created September 7, 2017 07:30
Xcode 9 beta 6 shows empty section headers & footers for nil value of viewForHeaderInSection. dirty workaround is required.
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
guard let v = self.tableView(tableView, viewForHeaderInSection: section) else { return 0 }
guard #available(iOS 11, *) else {
let h = v.bounds.height
return h > 0 ? h : UITableViewAutomaticDimension
}
return UITableViewAutomaticDimension // super call returns 0 on UITableViewController, though not overriding this cause behaviors like automatic.
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
@banjun
banjun / Podfile
Created September 5, 2017 03:26
Legacy Swift Pods list with generating warnings for non-Swift pods and already Swift 4 pods
LEGACY_SWIFT_PODS = [] # set all the derived pods initially. e.g. %w(BrightFutures JetToTheFuture)
def set_legacy_swift(installer)
UI.warn "#{LEGACY_SWIFT_PODS.count} pods are marked as legacy swift: #{LEGACY_SWIFT_PODS}"
installer.pods_project.targets.select {|t| LEGACY_SWIFT_PODS.include? t.name}.each do |target|
pod_target = installer.pod_targets.find {|t| t.name == target.name}
unless pod_target.uses_swift?
UI.warn "#{target.name} does not use Swift."
@banjun
banjun / MockAVCaptureDevice.swift
Last active July 13, 2023 14:53
mock AVCaptureDevice in Xcode 9
extension AVCaptureDevice {
class func swizzle() {
[(#selector(AVCaptureDevice.defaultDevice(withMediaType:)), #selector(AVCaptureDevice.mockDefaultDevice(withMediaType:)))].forEach {
let original = class_getClassMethod(self, $0)
let mock = class_getClassMethod(self, $1)
method_exchangeImplementations(original, mock)
}
[(#selector(AVCaptureDevice.hasMediaType(_:)), #selector(AVCaptureDevice.mockHasMediaType(_:))),
(#selector(AVCaptureDevice.supportsAVCaptureSessionPreset(_:)), #selector(AVCaptureDevice.mockSupportsAVCaptureSessionPreset)),
(#selector(AVCaptureDevice.isTorchModeSupported(_:)), #selector(AVCaptureDevice.mockIsTorchModeSupported)),
@banjun
banjun / reactiveextensions.html
Created August 4, 2017 02:25
event sequences of ReactiveSwift & RxSwift
<div class="mermaid">
graph LR
subgraph ReactiveSwift
Signal("Signal#lt;Value, Error#gt;(state = not completed)")
Completed("(state = completed)")
Signal -- "Signal.Event.value(Value)" --> Signal
Signal -- "Signal.Event.failed(Error)" --> Completed
Signal -- "Signal.Event.completed" --> Completed
Signal -- "Signal.Event.interrupted" --> Completed
end
@banjun
banjun / sendAndGetFuture.swift
Last active August 1, 2017 03:01
ReactiveSwift: send SignalProducer as value and get Future for the SignalProducer completion
extension SignalProducerProtocol {
func resolveFuture(_ resolver: @escaping (Result<Value, Error>) -> Void) -> SignalProducer<Value, Error> {
return on(value: {resolver(.success($0))})
.on(failed: {resolver(.failure($0))})
}
// create SignalProducer that create Future with the autoclosure on start and send a result to the inner observer
init(_ future: @escaping @autoclosure (Void) -> Future<Value, Error>) {
self.init { observer, _ in
future().onSuccess {observer.send(value: $0)}