<commit_before>//
//  BaseViewModel.swift
//  Common
//
//  Created by <NAME> on 2017. 8. 22..
//  Copyright © 2017년 apptube. All rights reserved.
//

import Foundation

import RxSwift
import RxCocoa

open class BaseViewModel<T> {
  private(set) var state: PublishSubject<T> = PublishSubject<T>()
  
  public func stateChanged(_ value: T) {
    self.state.onNext(value)
  }
}

public protocol ViewBindable {
  associatedtype Command
  associatedtype Action
  associatedtype State
  
  var disposeBag: DisposeBag { get }
  var command: PublishSubject<Command> { get }
  var action: Action { get }
  var state: State { get }
  
  func commandBind()
}
<commit_msg>no message<commit_after>//
//  BaseViewModel.swift
//  Common
//
//  Created by <NAME> on 2017. 8. 22..
//  Copyright © 2017년 apptube. All rights reserved.
//

import Foundation

import RxSwift
import RxCocoa

public protocol ViewBindable {
  associatedtype Command
  associatedtype Action
  associatedtype State
  
  var disposeBag: DisposeBag { get }
  var command: PublishSubject<Command> { get }
  var action: Action { get }
  var state: State { get }
  
  func commandBind()
}

{'fraction_non_alphanumeric': 0.09886264216972879, 'fraction_numerical': 0.019247594050743656, 'mean_word_length': 3.2527881040892193, 'pattern_counts': {'":': 0, '<': 10, '<?xml version=': 0, '>': 10, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2393351', 'n_tokens_mistral': 391, 'n_tokens_neox': 363, 'n_words': 115}