Skip to content

Instantly share code, notes, and snippets.

View vikingosegundo's full-sized avatar

Manuel Meyer vikingosegundo

  • Groningen, Netherlands
View GitHub Profile
struct Lights: View {
init(_ rootHandler: @escaping (Message) -> ()) {
self.rootHandler = rootHandler
}
var body: some View {
VStack {
VStack {
NavigationView {
List {
ForEach(Array(viewState.lights.enumerated()), id:\.offset) { LightCell(light: $1, rootHandler:rootHandler) }
public struct ContentView: View {
public init(viewState: ViewState, rootHandler: @escaping (Message) -> ()) {
self.viewState = viewState
self.rootHandler = rootHandler
}
public var body: some View {
TabView(selection:$tab) {
Dashboard(rootHandler).tabItem { Label(name(for:0), systemImage:imageName(for:0)) }.tag(0)
Lights (rootHandler).tabItem { Label(name(for:1), systemImage:imageName(for:1)) }.tag(1)
Rooms (rootHandler).tabItem { Label(name(for:2), systemImage:imageName(for:2)) }.tag(2)
public
final class ViewState: ObservableObject {
@Published public var lights : [Light ] = []
@Published public var rooms : [Room ] = []
@Published public var favorites : [Favorite] = []
public init(store:Store<AppState,AppState.Change>) {
store.updated { self.process(state(in:store)) }
process(store.state())
}
fileprivate var store : Store = createDiskStore()
fileprivate var viewState : ViewState = ViewState(store: store)
fileprivate var rootHandler: (Message) -> () = createAppDomain(
store : store,
receivers : [viewState.handle(msg:)],
rootHandler: { rootHandler($0) }
)
@main
final
class BrighterHueApp: App {
.by(.adding(.light(<aLight>)))
.by(.adding(.favorite(<aFavorite>)))
.by(.replacing(.lights(<aListOfLights>)))
.by(.replacing(.light(<aLight>)))
.by(.replacing(.rooms(<aListOfRooms>)))
.by(.removing(.favorite(<aFavorite>)))
struct Dimmer: UseCase {
enum Request { case increase(Light.Value, by:Light.Value.Increment, on:Light )
case decrease(Light.Value, by:Light.Value.Increment, on:Light ) }
enum Response { case increase(Light.Value, by:Light.Value.Increment, on:Light, Outcome)
case decrease(Light.Value, by:Light.Value.Increment, on:Light, Outcome) }
init(lightsStack: LightsStack, store: Store, responder: @escaping (Response) -> ()) {
self.lightsStack = lightsStack
self.store = store
self.respond = responder
}
let light = Light(id:"01", name:"01")
.alter(
by:
.setting(.brightness (to:0.5 )),
.setting(.hue (to:0.5 )),
.setting(.saturation (to:0.5 )),
.setting(.temperature(to:200.mk)),
.turning(.it(.on))
)
typealias Access<S> = ( ) -> S
typealias Change<C> = ( C... ) -> ()
typealias Reset = ( ) -> ()
typealias Callback = ( @escaping () -> () ) -> ()
typealias Destroy = ( ) -> ()
typealias Store<S,C> = (
state: Access<S>,
change: Change<C>,
reset: Reset,
func createDiskStore(
pathInDocs p: String ,
fileManager fm: FileManager = .default
) -> Store<AppState, AppState.Change>
{
var state = loadAppStateFromStore(pathInDocuments:p,fileManager:fm) { didSet { callbacks.forEach { $0() } } }
var callbacks: [() -> ()] = []
return (
state : { state },
change : { state = state.alter($0) ; persistStore(pathInDocuments:p, state:state, fileManager:fm) },
func createAdder(x:Int) -> (Int) -> Int {
var value = x
return {
value = value + $0
return value
}
}
let adder = createAdder(x: 5)
print(adder(4)) // -> 9