module Language.Fluent.Width where

import Data.Char (toLower)
import Prelude

data Width
    = -- | e.g. @A@, @5s@
      Narrow
    | -- | e.g. @Aug@, @5 s@
      Short
    | -- | e.g. @August@, @5 seconds@
      Long
    deriving stock (Width -> Width -> Bool
(Width -> Width -> Bool) -> (Width -> Width -> Bool) -> Eq Width
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Width -> Width -> Bool
== :: Width -> Width -> Bool
$c/= :: Width -> Width -> Bool
/= :: Width -> Width -> Bool
Eq, Width
Width -> Width -> Bounded Width
forall a. a -> a -> Bounded a
$cminBound :: Width
minBound :: Width
$cmaxBound :: Width
maxBound :: Width
Bounded, Int -> Width
Width -> Int
Width -> [Width]
Width -> Width
Width -> Width -> [Width]
Width -> Width -> Width -> [Width]
(Width -> Width)
-> (Width -> Width)
-> (Int -> Width)
-> (Width -> Int)
-> (Width -> [Width])
-> (Width -> Width -> [Width])
-> (Width -> Width -> [Width])
-> (Width -> Width -> Width -> [Width])
-> Enum Width
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Width -> Width
succ :: Width -> Width
$cpred :: Width -> Width
pred :: Width -> Width
$ctoEnum :: Int -> Width
toEnum :: Int -> Width
$cfromEnum :: Width -> Int
fromEnum :: Width -> Int
$cenumFrom :: Width -> [Width]
enumFrom :: Width -> [Width]
$cenumFromThen :: Width -> Width -> [Width]
enumFromThen :: Width -> Width -> [Width]
$cenumFromTo :: Width -> Width -> [Width]
enumFromTo :: Width -> Width -> [Width]
$cenumFromThenTo :: Width -> Width -> Width -> [Width]
enumFromThenTo :: Width -> Width -> Width -> [Width]
Enum)

instance Show Width where
    show :: Width -> [Char]
show Width
Narrow = [Char]
"narrow"
    show Width
Short = [Char]
"short"
    show Width
Long = [Char]
"long"

instance Read Width where
    readsPrec :: Int -> ReadS Width
readsPrec Int
_ [Char]
s = [(Width
it, [Char]
"") | Width
it <- [Width
forall a. Bounded a => a
minBound .. Width
forall a. Bounded a => a
maxBound], (Char -> Char) -> [Char] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower (Width -> [Char]
forall a. Show a => a -> [Char]
show Width
it) [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== (Char -> Char) -> [Char] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toLower [Char]
s]

-- | How often a date field symbol is repeated in a skeleton for this width,
-- e.g. @MMM@ gives 'Short' months, @MMMM@ 'Long' ones and @MMMMM@ 'Narrow' ones.
-- See the <https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table Unicode date field symbol table>.
letters :: Width -> Int
letters :: Width -> Int
letters Width
Short = Int
3
letters Width
Long = Int
4
letters Width
Narrow = Int
5