@@ -1,4 +1,4 @@
1−module Ur.Run exposing (Model, Msg, application)
1+module Ur.Run exposing (Model, Msg, Program, application)
3import Browser exposing (Document, UrlRequest)
3import Browser exposing (Document, UrlRequest)
4import Browser.Navigation as Nav
4import Browser.Navigation as Nav
@@ -55,6 +55,10 @@ type Msg msg
55 | RetryRequests
55 | RetryRequests
58+type alias Program model msg =
59+ Platform.Program Flags (Model model msg) (Msg msg)
58application :
62application :
59 { init : Url -> Nav.Key -> ( model, Ur.Cmd.Cmd msg )
63 { init : Url -> Nav.Key -> ( model, Ur.Cmd.Cmd msg )
60 , view : model -> Document msg
64 , view : model -> Document msg
@@ -67,66 +71,20 @@ application :
67 , onEventSourceMsg : (JD.Value -> Msg msg) -> Sub (Msg msg)
71 , onEventSourceMsg : (JD.Value -> Msg msg) -> Sub (Msg msg)
68 , urbitUrl : model -> String
72 , urbitUrl : model -> String
70− -> Program Flags (Model model msg) (Msg msg)
74+ -> Program model msg
71application inp =
75application inp =
73− { init, view, onUrlRequest, onUrlChange, onEventSourceMsg } =
77+ { view, onUrlRequest, onUrlChange } =
76 Browser.application
80 Browser.application
77− { init =
81+ { init = \flags url key -> init inp (inp.init url key) flags
83− { subscriptions, eventId, subscriptionRequests, subscriptionIntMapping } =
87− (inp.urbitSubscriptions app |> (\(Ur.Sub.Internal.Sub x) -> x))
89− ( eventId_, cmds, urReqs ) =
90− processCmd eventId appCmds
93− inp.urbitUrl app ++ "/~/channel/" ++ flags.uid
95− ( { subscriptions = subscriptions
96− , subscriptionIntMapping = subscriptionIntMapping
101− , requestsToRetry = []
104− , pureCmd NeedsActivation
106− { requests = urReqs ++ subscriptionRequests
115 \model ->
83 \model ->
116 view model.app
84 view model.app
117 |> (\{ body, title } -> { title = title, body = body |> List.map (Html.map AppMsg) })
85 |> (\{ body, title } -> { title = title, body = body |> List.map (Html.map AppMsg) })
118 , update = update inp
86 , update = update inp
119− , subscriptions =
87+ , subscriptions = subscriptions inp
122− [ inp.subscriptions model.app |> Sub.map AppMsg
123− , onEventSourceMsg EventSourceMsg
124− , if List.isEmpty model.requestsToRetry then
128− Time.every 1000 (always RetryRequests)
130 , onUrlRequest = \req -> onUrlRequest req |> AppMsg
88 , onUrlRequest = \req -> onUrlRequest req |> AppMsg
131 , onUrlChange = \url -> onUrlChange url |> AppMsg
89 , onUrlChange = \url -> onUrlChange url |> AppMsg
@@ -153,20 +111,21 @@ update inp msg model =
153 ( appModel, appCmds ) =
111 ( appModel, appCmds ) =
154 inp.update msg_ model.app
112 inp.update msg_ model.app
156− { subscriptions, eventId, subscriptionRequests, subscriptionIntMapping } =
114+ -- { subscriptions, eventId, subscriptionRequests, subscriptionIntMapping } =
157 processUrSubs
116 processUrSubs
158 model.eventId
117 model.eventId
159 model.subscriptions
118 model.subscriptions
160 (inp.urbitSubscriptions model.app |> (\(Ur.Sub.Internal.Sub x) -> x))
119 (inp.urbitSubscriptions model.app |> (\(Ur.Sub.Internal.Sub x) -> x))
162 ( eventId_, cmds, urReqs ) =
121 ( eventId_, cmds, urReqs ) =
163− processCmd eventId appCmds
122+ processCmd subsResult.eventId appCmds
165 ( { model
124 ( { model
166 | app = appModel
125 | app = appModel
167 , eventId = eventId_
126 , eventId = eventId_
168− , subscriptions = subscriptions
127+ , subscriptions = subsResult.subscriptions
169− , subscriptionIntMapping = model.subscriptionIntMapping |> Dict.union subscriptionIntMapping
128+ , subscriptionIntMapping = model.subscriptionIntMapping |> Dict.union subsResult.subscriptionIntMapping
171 , Cmd.batch
130 , Cmd.batch
@@ -177,9 +136,9 @@ update inp msg model =
177 , requests = urReqs
136 , requests = urReqs
180− { requests = subscriptionRequests
139+ { requests = subsResult.subscriptionRequests
181 , url = url
140 , url = url
182− , error = subscriptionRequests |> List.map (\( _, x ) -> x) |> FailedRequest
141+ , error = subsResult.subscriptionRequests |> List.map (\( _, x ) -> x) |> FailedRequest
183 , success = Noop
142 , success = Noop
@@ -373,3 +332,62 @@ processUrSubs eventId existingSubscriptions urbitSubs_ =
373 , subscriptionRequests =
332 , subscriptionRequests =
374 removedSubscriptionActions ++ (newSubscriptionActions |> List.map (\( id, ( req, _ ) ) -> ( id, req )))
333 removedSubscriptionActions ++ (newSubscriptionActions |> List.map (\( id, ( req, _ ) ) -> ( id, req )))
338+ { a | urbitSubscriptions : model -> Ur.Sub.Sub msg, urbitUrl : model -> String }
339+ -> ( model, Ur.Cmd.Cmd msg )
345+init inp ( app, appCmds ) flags =
351+ (inp.urbitSubscriptions app |> (\(Ur.Sub.Internal.Sub x) -> x))
353+ ( eventId_, cmds, urReqs ) =
354+ processCmd subsResult.eventId appCmds
357+ inp.urbitUrl app ++ "/~/channel/" ++ flags.uid
359+ ( { subscriptions = subsResult.subscriptions
360+ , subscriptionIntMapping = subsResult.subscriptionIntMapping
363+ , eventId = eventId_
365+ , requestsToRetry = []
368+ , pureCmd NeedsActivation
370+ { requests = urReqs ++ subsResult.subscriptionRequests
381+ { a | subscriptions : b -> Sub msg, onEventSourceMsg : (JD.Value -> Msg c) -> Sub (Msg msg) }
382+ -> { d | app : b, requestsToRetry : List e }
384+subscriptions inp model =
386+ [ inp.subscriptions model.app |> Sub.map AppMsg
387+ , inp.onEventSourceMsg EventSourceMsg
388+ , if List.isEmpty model.requestsToRetry then
392+ Time.every 1000 (always RetryRequests)