{-# LANGUAGE Safe #-}
module Data.Char.Number.VulgarFraction (
ratioToVulgar, toVulgar
, ratioToVulgarFallback, toVulgarFallback
) where
import Data.Ratio(Ratio, numerator, denominator)
import Data.Text(Text, cons, singleton)
import Data.Char.Small(asSub', ratioPartsToUnicode')
ratioToVulgar :: Integral i
=> Ratio i
-> Maybe Char
ratioToVulgar :: Ratio i -> Maybe Char
ratioToVulgar Ratio i
r = i -> i -> Maybe Char
forall i j. (Integral i, Integral j) => i -> j -> Maybe Char
toVulgar (Ratio i -> i
forall a. Ratio a -> a
numerator Ratio i
r) (Ratio i -> i
forall a. Ratio a -> a
denominator Ratio i
r)
ratioToVulgarFallback :: Integral i
=> Ratio i
-> Text
ratioToVulgarFallback :: Ratio i -> Text
ratioToVulgarFallback Ratio i
nd = i -> i -> Text
forall i j. (Integral i, Integral j) => i -> j -> Text
toVulgarFallback (Ratio i -> i
forall a. Ratio a -> a
numerator Ratio i
nd) (Ratio i -> i
forall a. Ratio a -> a
denominator Ratio i
nd)
toVulgar :: (Integral i, Integral j)
=> i
-> j
-> Maybe Char
toVulgar :: i -> j -> Maybe Char
toVulgar i
1 j
4 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x00bc'
toVulgar i
1 j
2 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x00bd'
toVulgar i
3 j
4 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x00be'
toVulgar i
1 j
7 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2150'
toVulgar i
1 j
9 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2151'
toVulgar i
1 j
10 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2152'
toVulgar i
1 j
3 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2153'
toVulgar i
2 j
3 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2154'
toVulgar i
1 j
5 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2155'
toVulgar i
2 j
5 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2156'
toVulgar i
3 j
5 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2157'
toVulgar i
4 j
5 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2158'
toVulgar i
1 j
6 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2159'
toVulgar i
5 j
6 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x215a'
toVulgar i
1 j
8 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x215b'
toVulgar i
3 j
8 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x215c'
toVulgar i
5 j
8 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x215d'
toVulgar i
7 j
8 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x215e'
toVulgar i
0 j
3 = Char -> Maybe Char
forall a. a -> Maybe a
Just Char
'\x2189'
toVulgar i
_ j
_ = Maybe Char
forall a. Maybe a
Nothing
toVulgarFallback :: (Integral i, Integral j)
=> i
-> j
-> Text
toVulgarFallback :: i -> j -> Text
toVulgarFallback i
i j
j = Text -> (Char -> Text) -> Maybe Char -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (i -> j -> Text
forall i j. (Integral j, Integral i) => i -> j -> Text
go i
i j
j) Char -> Text
singleton (i -> j -> Maybe Char
forall i j. (Integral i, Integral j) => i -> j -> Maybe Char
toVulgar i
i j
j)
where go :: i -> j -> Text
go i
1 j
d | j
d j -> j -> Bool
forall a. Ord a => a -> a -> Bool
> j
0 = Char -> Text -> Text
cons Char
'\x215f' ( j -> Text
forall i. Integral i => i -> Text
asSub' j
d)
go i
n j
d = i -> j -> Text
forall i j. (Integral i, Integral j) => i -> j -> Text
ratioPartsToUnicode' i
n j
d