on master help sign in
Refactor
commitfe9c4e6981c3d233c4fb41c4615ce3ce19034b14 authoriko <mail@iko.soy> dateSat 17 Jun 2023, 14:16 (3 years ago) parent6b517b8
2 files changed+76−57
example/src/Main.elm+1 src/Ur/Run.elm+75−57
example/src/Main.elm+1
@@ -20,6 +20,7 @@ import Widget.Icon as Icon
2020import Widget.Material as Material
2121
2222
23+main : Ur.Run.Program Model Msg
2324main =
2425 Ur.Run.application
2526 { init =
src/Ur/Run.elm+75−57
@@ -1,4 +1,4 @@
1−module Ur.Run exposing (Model, Msg, application)
1+module Ur.Run exposing (Model, Msg, Program, application)
22
33import Browser exposing (Document, UrlRequest)
44import Browser.Navigation as Nav
@@ -55,6 +55,10 @@ type Msg msg
5555 | RetryRequests
5656
5757
58+type alias Program model msg =
59+ Platform.Program Flags (Model model msg) (Msg msg)
60+
61+
5862application :
5963 { init : Url -> Nav.Key -> ( model, Ur.Cmd.Cmd msg )
6064 , view : model -> Document msg
@@ -67,66 +71,20 @@ application :
6771 , onEventSourceMsg : (JD.Value -> Msg msg) -> Sub (Msg msg)
6872 , urbitUrl : model -> String
6973 }
70− -> Program Flags (Model model msg) (Msg msg)
74+ -> Program model msg
7175application inp =
7276 let
73− { init, view, onUrlRequest, onUrlChange, onEventSourceMsg } =
77+ { view, onUrlRequest, onUrlChange } =
7478 inp
7579 in
7680 Browser.application
77− { init =
78− \flags u key ->
79− let
80− ( app, appCmds ) =
81− init u key
82−
83− { subscriptions, eventId, subscriptionRequests, subscriptionIntMapping } =
84− processUrSubs
85− 0
86− Dict.empty
87− (inp.urbitSubscriptions app |> (\(Ur.Sub.Internal.Sub x) -> x))
88−
89− ( eventId_, cmds, urReqs ) =
90− processCmd eventId appCmds
91−
92− url =
93− inp.urbitUrl app ++ "/~/channel/" ++ flags.uid
94− in
95− ( { subscriptions = subscriptions
96− , subscriptionIntMapping = subscriptionIntMapping
97− , app = app
98− , connected = False
99− , eventId = eventId_
100− , flags = flags
101− , requestsToRetry = []
102− }
103− , [ cmds
104− , pureCmd NeedsActivation
105− , send
106− { requests = urReqs ++ subscriptionRequests
107− , url = url
108− , error = Noop
109− , success = Noop
110− }
111− ]
112− |> Cmd.batch
113− )
81+ { init = \flags url key -> init inp (inp.init url key) flags
11482 , view =
11583 \model ->
11684 view model.app
11785 |> (\{ body, title } -> { title = title, body = body |> List.map (Html.map AppMsg) })
11886 , update = update inp
119− , subscriptions =
120− \model ->
121− Sub.batch
122− [ inp.subscriptions model.app |> Sub.map AppMsg
123− , onEventSourceMsg EventSourceMsg
124− , if List.isEmpty model.requestsToRetry then
125− Sub.none
126−
127− else
128− Time.every 1000 (always RetryRequests)
129− ]
87+ , subscriptions = subscriptions inp
13088 , onUrlRequest = \req -> onUrlRequest req |> AppMsg
13189 , onUrlChange = \url -> onUrlChange url |> AppMsg
13290 }
@@ -153,20 +111,21 @@ update inp msg model =
153111 ( appModel, appCmds ) =
154112 inp.update msg_ model.app
155113
156− { subscriptions, eventId, subscriptionRequests, subscriptionIntMapping } =
114+ -- { subscriptions, eventId, subscriptionRequests, subscriptionIntMapping } =
115+ subsResult =
157116 processUrSubs
158117 model.eventId
159118 model.subscriptions
160119 (inp.urbitSubscriptions model.app |> (\(Ur.Sub.Internal.Sub x) -> x))
161120
162121 ( eventId_, cmds, urReqs ) =
163− processCmd eventId appCmds
122+ processCmd subsResult.eventId appCmds
164123 in
165124 ( { model
166125 | app = appModel
167126 , eventId = eventId_
168− , subscriptions = subscriptions
169− , subscriptionIntMapping = model.subscriptionIntMapping |> Dict.union subscriptionIntMapping
127+ , subscriptions = subsResult.subscriptions
128+ , subscriptionIntMapping = model.subscriptionIntMapping |> Dict.union subsResult.subscriptionIntMapping
170129 }
171130 , Cmd.batch
172131 [ cmds
@@ -177,9 +136,9 @@ update inp msg model =
177136 , requests = urReqs
178137 }
179138 , send
180− { requests = subscriptionRequests
139+ { requests = subsResult.subscriptionRequests
181140 , url = url
182− , error = subscriptionRequests |> List.map (\( _, x ) -> x) |> FailedRequest
141+ , error = subsResult.subscriptionRequests |> List.map (\( _, x ) -> x) |> FailedRequest
183142 , success = Noop
184143 }
185144 ]
@@ -373,3 +332,62 @@ processUrSubs eventId existingSubscriptions urbitSubs_ =
373332 , subscriptionRequests =
374333 removedSubscriptionActions ++ (newSubscriptionActions |> List.map (\( id, ( req, _ ) ) -> ( id, req )))
375334 }
335+
336+
337+init :
338+ { a | urbitSubscriptions : model -> Ur.Sub.Sub msg, urbitUrl : model -> String }
339+ -> ( model, Ur.Cmd.Cmd msg )
340+ -> Flags
341+ ->
342+ ( Model model msg
343+ , Cmd (Msg msg)
344+ )
345+init inp ( app, appCmds ) flags =
346+ let
347+ subsResult =
348+ processUrSubs
349+ 0
350+ Dict.empty
351+ (inp.urbitSubscriptions app |> (\(Ur.Sub.Internal.Sub x) -> x))
352+
353+ ( eventId_, cmds, urReqs ) =
354+ processCmd subsResult.eventId appCmds
355+
356+ url =
357+ inp.urbitUrl app ++ "/~/channel/" ++ flags.uid
358+ in
359+ ( { subscriptions = subsResult.subscriptions
360+ , subscriptionIntMapping = subsResult.subscriptionIntMapping
361+ , app = app
362+ , connected = False
363+ , eventId = eventId_
364+ , flags = flags
365+ , requestsToRetry = []
366+ }
367+ , [ cmds
368+ , pureCmd NeedsActivation
369+ , send
370+ { requests = urReqs ++ subsResult.subscriptionRequests
371+ , url = url
372+ , error = Noop
373+ , success = Noop
374+ }
375+ ]
376+ |> Cmd.batch
377+ )
378+
379+
380+subscriptions :
381+ { a | subscriptions : b -> Sub msg, onEventSourceMsg : (JD.Value -> Msg c) -> Sub (Msg msg) }
382+ -> { d | app : b, requestsToRetry : List e }
383+ -> Sub (Msg msg)
384+subscriptions inp model =
385+ Sub.batch
386+ [ inp.subscriptions model.app |> Sub.map AppMsg
387+ , inp.onEventSourceMsg EventSourceMsg
388+ , if List.isEmpty model.requestsToRetry then
389+ Sub.none
390+
391+ else
392+ Time.every 1000 (always RetryRequests)
393+ ]