2022-03-25 19:03:22 +03:00
|
|
|
module Effect exposing (Effect(..), batch, fromCmd, map, none, perform)
|
|
|
|
|
|
|
|
import Browser.Navigation
|
2022-04-05 02:22:45 +03:00
|
|
|
import Http
|
|
|
|
import Url exposing (Url)
|
2022-03-25 19:03:22 +03:00
|
|
|
|
|
|
|
|
|
|
|
type Effect msg
|
|
|
|
= None
|
|
|
|
| Cmd (Cmd msg)
|
|
|
|
| Batch (List (Effect msg))
|
2022-04-05 02:22:45 +03:00
|
|
|
| FetchPageData
|
|
|
|
{ body : Maybe { contentType : String, body : String }
|
|
|
|
, path : Maybe String
|
|
|
|
, toMsg : Result Http.Error Url -> msg
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type alias RequestInfo =
|
|
|
|
{ contentType : String
|
|
|
|
, body : String
|
|
|
|
}
|
2022-03-25 19:03:22 +03:00
|
|
|
|
|
|
|
|
|
|
|
none : Effect msg
|
|
|
|
none =
|
|
|
|
None
|
|
|
|
|
|
|
|
|
|
|
|
batch : List (Effect msg) -> Effect msg
|
|
|
|
batch =
|
|
|
|
Batch
|
|
|
|
|
|
|
|
|
|
|
|
fromCmd : Cmd msg -> Effect msg
|
|
|
|
fromCmd =
|
|
|
|
Cmd
|
|
|
|
|
|
|
|
|
|
|
|
map : (a -> b) -> Effect a -> Effect b
|
|
|
|
map fn effect =
|
|
|
|
case effect of
|
|
|
|
None ->
|
|
|
|
None
|
|
|
|
|
|
|
|
Cmd cmd ->
|
|
|
|
Cmd (Cmd.map fn cmd)
|
|
|
|
|
|
|
|
Batch list ->
|
|
|
|
Batch (List.map (map fn) list)
|
|
|
|
|
2022-04-05 02:22:45 +03:00
|
|
|
FetchPageData fetchInfo ->
|
|
|
|
FetchPageData
|
|
|
|
{ body = fetchInfo.body
|
|
|
|
, path = fetchInfo.path
|
|
|
|
, toMsg = fetchInfo.toMsg >> fn
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
perform :
|
|
|
|
{ fetchRouteData :
|
|
|
|
{ body : Maybe { contentType : String, body : String }
|
|
|
|
, path : Maybe String
|
|
|
|
, toMsg : Result Http.Error Url -> pageMsg
|
|
|
|
}
|
|
|
|
-> Cmd msg
|
|
|
|
}
|
|
|
|
-> (pageMsg -> msg)
|
|
|
|
-> Browser.Navigation.Key
|
|
|
|
-> Effect pageMsg
|
|
|
|
-> Cmd msg
|
|
|
|
perform info fromPageMsg key effect =
|
2022-03-25 19:03:22 +03:00
|
|
|
case effect of
|
|
|
|
None ->
|
|
|
|
Cmd.none
|
|
|
|
|
|
|
|
Cmd cmd ->
|
|
|
|
Cmd.map fromPageMsg cmd
|
|
|
|
|
|
|
|
Batch list ->
|
2022-04-05 02:22:45 +03:00
|
|
|
Cmd.batch (List.map (perform info fromPageMsg key) list)
|
|
|
|
|
|
|
|
FetchPageData fetchInfo ->
|
|
|
|
info.fetchRouteData
|
|
|
|
{ body = fetchInfo.body
|
|
|
|
, path = fetchInfo.path
|
|
|
|
, toMsg = fetchInfo.toMsg
|
|
|
|
}
|