Skip to content

Instantly share code, notes, and snippets.

@manishkkatoch
manishkkatoch / MovieController.swift
Created August 18, 2019 16:21
HATEOAS MovieController
//
// MovieViewController.swift
// Acmeflix
//
// Created by Manish Katoch on 08/08/19.
// Copyright © 2019 Manish Katoch. All rights reserved.
//
import Foundation
import UIKit
import UIKit
import SwiftyJSON
class ViewController: UIViewController {
private let reuseIdentifier = "MovieCell"
private let httpClient = RestfulClient.shared
private var movies: [Resource<Movie>] = []
@manishkkatoch
manishkkatoch / Root.swift
Created August 16, 2019 13:06
HATEOAS Root
class Root: Decodable {}
extension Resource where T:Root {
func hasLibrary() -> Bool {
return self.hasCapability(for: "library")
}
func getLibraryLink() -> Link? {
return self.getRelation(forRel: "library")
}
@manishkkatoch
manishkkatoch / Link.swift
Created August 16, 2019 12:36
HATEOAS Link
@manishkkatoch
manishkkatoch / HttpClient.swift
Last active August 16, 2019 12:35
HATEOAS Link
//
// HttpClient.swift
// Acmeflix
//
// Created by Manish Katoch on 04/08/19.
// Copyright © 2019 Manish Katoch. All rights reserved.
//
import Foundation
@manishkkatoch
manishkkatoch / Resource.swift
Created August 16, 2019 12:24
HATEOAS Resource
typealias LinkAvailableHandler = (Link) -> Void
typealias LinkUnAvailableHandler = () -> Void
protocol RestResource: Decodable {
associatedtype modelType where modelType : Decodable
var item: modelType? {get}
var links: Array<Link> { get }
}
extension RestResource {
// simple Member class
case class Member(id: String, name: String, points: Long)
// member types
trait MemberType {val member: Member}
case class FirstTimer(member: Member) extends MemberType
case class FrequentShopper(member: Member) extends MemberType
case class Patron(member: Member) extends MemberType
// membership card
@manishkkatoch
manishkkatoch / Discounted.scala
Last active February 12, 2019 04:08
Discounted.scala
trait Discounted[T] {
def getDiscount: Double
}
object Discounted {
// apply method called by compiler to instantiate if no instance found
def apply[T](implicit discounted: Discounted[T]) = discounted
def createDiscounted[T](fn: () => Double) = new Discounted[T] {
override def getDiscount: Double = fn()
}
object syntax {
implicit class RichDataSet[A](dataSet: Dataset[A]) {
val enriched: RichDataSet[A] = this
def apply[K](column: Witness.Lt[Symbol])(implicit lhsExists: PropertyExists[A, column.T, K]): Column =
new Column(column.value.name)
def leftJoin[B, K](withDataSet: Dataset[B]): JoinDataSet[A, B] = JoinDataSet.leftJoin(dataSet, withDataSet)
@implicitNotFound(msg = "${PName} not found in ${T}")
trait PropertiesExists[T, PName <: HList, PType]
object PropertiesExists {
implicit def forHNil[T, PName, PType](
implicit head: PropertyExists[T, PName, PType]): PropertiesExists[T, PName :: HNil, PType] =
new PropertiesExists[T, PName :: HNil, PType] {}
implicit def forHList[T, PNameHead, PNameTail <: HList, PTypeForHead, PTypeForTail](
implicit headExists: PropertyExists[T, PNameHead, PTypeForHead],