elm-pages-v3-beta/plugins/Timestamps.elm
2021-08-13 08:29:05 -07:00

70 lines
1.8 KiB
Elm

module Timestamps exposing (Timestamps, data, format)
import DataSource exposing (DataSource)
import DataSource.Port
import DateFormat
import Json.Encode
import List.Extra
import OptimizedDecoder as Decode exposing (Decoder)
import Result.Extra
import Time
type alias Timestamps =
{ updated : Time.Posix
, created : Time.Posix
}
data : String -> DataSource Timestamps
data filePath =
DataSource.Port.get "gitTimestamps"
(Json.Encode.string filePath)
(Decode.string
|> Decode.map (String.trim >> String.split "\n")
|> Decode.map (List.map secondsStringToPosix)
|> Decode.map Result.Extra.combine
|> Decode.map
(Result.withDefault
[ Time.millisToPosix 0
, Time.millisToPosix 0
]
)
|> Decode.map (firstAndLast Timestamps >> Result.fromMaybe "Error")
|> Decode.andThen Decode.fromResult
)
firstAndLast : (a -> a -> b) -> List a -> Maybe b
firstAndLast constructor list =
Maybe.map2 constructor
(List.head list)
(List.Extra.last list)
secondsStringToPosix : String -> Result String Time.Posix
secondsStringToPosix posixTime =
posixTime
|> String.trim
|> String.toInt
|> Maybe.map (\unixTimeInSeconds -> (unixTimeInSeconds * 1000) |> Time.millisToPosix)
|> Result.fromMaybe "Expected int"
format : Time.Posix -> String
format posix =
DateFormat.format
[ DateFormat.monthNameFull
, DateFormat.text " "
, DateFormat.dayOfMonthNumber
, DateFormat.text ", "
, DateFormat.yearNumber
]
pacificZone
posix
pacificZone : Time.Zone
pacificZone =
Time.customZone (-60 * 7) []