Skip to content

Commit

Permalink
Implement RelativeTimeFormat
Browse files Browse the repository at this point in the history
  • Loading branch information
pete-murphy committed Jun 7, 2023
1 parent b00f53b commit da5576c
Show file tree
Hide file tree
Showing 3 changed files with 178 additions and 1 deletion.
21 changes: 21 additions & 0 deletions src/Web/Intl/RelativeTimeFormat.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"use strict";

export function _new(locales, opts) {
return new Intl.RelativeTimeFormat(locales, opts);
}

export function _format(relativeTimeFormat, value, unit) {
return relativeTimeFormat.format(value, unit);
}

export function _formatToParts(relativeTimeFormat, value, unit) {
return relativeTimeFormat.formatToParts(value, unit);
}

export function _resolvedOptions(relativeTimeFormat) {
return relativeTimeFormat.resolvedOptions();
}

export function _supportedLocalesOf(locales, opts) {
return Intl.RelativeTimeFormat.supportedLocalesOf(locales, opts);
}
112 changes: 112 additions & 0 deletions src/Web/Intl/RelativeTimeFormat.purs
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
module Web.Intl.RelativeTimeFormat
-- * Types
( RelativeTimeFormat
, RelativeTimeFormatOptions

-- * Constructor
, new
, new_

-- * Methods
, supportedLocalesOf
, supportedLocalesOf_
, format
, formatToParts
, resolvedOptions
) where

import Data.Function.Uncurried (Fn2, Fn3)
import Data.Function.Uncurried as Function.Uncurried
import Effect (Effect)
import Effect.Uncurried (EffectFn1, EffectFn2)
import Effect.Uncurried as Effect.Uncurried
import Prim.Row (class Union)
import Unsafe.Coerce as Unsafe.Coerce
import Web.Intl.LocaleOptions (LocaleOptions)

type RelativeTimeFormatOptions =
( localeMatcher :: String
, numeric :: String
, style :: String
)

foreign import data RelativeTimeFormat :: Type

foreign import _new
:: EffectFn2
(Array String)
(Record RelativeTimeFormatOptions)
RelativeTimeFormat

new
:: forall options options'
. Union options options' RelativeTimeFormatOptions
=> Array String
-> Record options
-> Effect RelativeTimeFormat
new locales options =
Effect.Uncurried.runEffectFn2 _new locales (Unsafe.Coerce.unsafeCoerce options)

new_
:: Array String
-> Effect RelativeTimeFormat
new_ locales =
new locales {}

foreign import _supportedLocalesOf
:: Fn2
(Array String)
(Record LocaleOptions)
(Array String)

supportedLocalesOf
:: forall options options'
. Union options options' LocaleOptions
=> Array String
-> Record options
-> Array String
supportedLocalesOf locales options =
Function.Uncurried.runFn2 _supportedLocalesOf locales (Unsafe.Coerce.unsafeCoerce options)

supportedLocalesOf_
:: Array String
-> Array String
supportedLocalesOf_ locales =
supportedLocalesOf locales {}

foreign import _format
:: Fn3
RelativeTimeFormat
Int
-- Possible values are: "year", "quarter", "month", "week", "day", "hour", "minute", "second"
String
String

format :: RelativeTimeFormat -> Int -> String -> String
format = Function.Uncurried.runFn3 _format

foreign import _formatToParts
:: Fn3
RelativeTimeFormat
Int
-- Possible values are: "year", "quarter", "month", "week", "day", "hour", "minute", "second"
String
(Array { type :: String, value :: String })

formatToParts :: RelativeTimeFormat -> Int -> String -> Array { type :: String, value :: String }
formatToParts = Function.Uncurried.runFn3 _formatToParts

type ResolvedOptions =
{ locale :: String
, style :: String
, numeric :: String
, numberingSystem :: String
}

foreign import _resolvedOptions
:: EffectFn1
RelativeTimeFormat
ResolvedOptions

resolvedOptions :: RelativeTimeFormat -> Effect ResolvedOptions
resolvedOptions = Effect.Uncurried.runEffectFn1 _resolvedOptions
46 changes: 45 additions & 1 deletion test/Main.purs
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@ import Record as Record
import Test.Assert as Test
import Web.Intl.DateTimeFormat as DateTimeFormat
import Web.Intl.NumberFormat as NumberFormat
import Web.Intl.RelativeTimeFormat as RelativeTimeFormat

main :: Effect Unit
main = do
test_DateTimeFormat
test_NumberFormat
test_RelativeTimeFormat

test_DateTimeFormat :: Effect Unit
test_DateTimeFormat = do
Expand Down Expand Up @@ -214,4 +216,46 @@ test_NumberFormat = do
-- , { type: "fraction", value: "32" }
-- ]
-- <#> \part -> part { value = String.trim part.value }
-- }
-- }

test_RelativeTimeFormat :: Effect Unit
test_RelativeTimeFormat = do
Console.log "RelativeTimeFormat.supportedLocalesOf"
Test.assertEqual
{ actual: RelativeTimeFormat.supportedLocalesOf [ "en-US" ] { localeMatcher: "best fit" }
, expected: [ "en-US" ]
}

Console.log "RelativeTimeFormat.supportedLocalesOf_"
Test.assertEqual
{ actual: RelativeTimeFormat.supportedLocalesOf_ [ "en-US" ]
, expected: [ "en-US" ]
}

format <- RelativeTimeFormat.new [ "en-US" ] { numeric: "auto" }

Console.logShow "RelativeTimeFormat##format"
Test.assertEqual
{ actual: RelativeTimeFormat.format format (-1) "day"
, expected: "yesterday"
}

Console.log "RelativeTimeFormat##formatToParts"
Test.assertEqual
{ actual: RelativeTimeFormat.formatToParts format (-1) "day"
, expected:
[ { type: "literal", value: "yesterday" }
]
}

Console.log "RelativeTimeFormat##resolvedOptions"
resolvedOptions <- RelativeTimeFormat.resolvedOptions format
Test.assertEqual
{ actual: resolvedOptions
, expected:
{ locale: "en-US"
, numberingSystem: "latn"
, numeric: "auto"
, style: "long"
}
}

0 comments on commit da5576c

Please sign in to comment.