module Language.Drasil.People (
HasName
, Person, People, Conv(..)
, person, person', personWM, personWM', mononym
, name, nameStr
, lstName
, rendPersLFM, rendPersLFM', rendPersLFM''
, comparePeople
) where
data Person = Person { Person -> String
_given :: String
, Person -> String
_surname :: String
, Person -> [String]
_middle :: [String]
, Person -> Conv
_convention :: Conv
} deriving (Person -> Person -> Bool
(Person -> Person -> Bool)
-> (Person -> Person -> Bool) -> Eq Person
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Person -> Person -> Bool
$c/= :: Person -> Person -> Bool
== :: Person -> Person -> Bool
$c== :: Person -> Person -> Bool
Eq)
type People = [Person]
data Conv = Western
| Eastern
| Mono
deriving (Conv -> Conv -> Bool
(Conv -> Conv -> Bool) -> (Conv -> Conv -> Bool) -> Eq Conv
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Conv -> Conv -> Bool
$c/= :: Conv -> Conv -> Bool
== :: Conv -> Conv -> Bool
$c== :: Conv -> Conv -> Bool
Eq)
comparePeople :: [Person] -> [Person] -> Ordering
comparePeople :: [Person] -> [Person] -> Ordering
comparePeople [] [] = Ordering
EQ
comparePeople _ [] = Ordering
GT
comparePeople [] _ = Ordering
LT
comparePeople (Person f1 :: String
f1 l1 :: String
l1 _ _:xs :: [Person]
xs) (Person f2 :: String
f2 l2 :: String
l2 _ _:ys :: [Person]
ys)
| String
l1 String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
l2 = String
l1 String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` String
l2
| String
f1 String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
f2 = String
f1 String -> String -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` String
f2
| Bool
otherwise = [Person] -> [Person] -> Ordering
comparePeople [Person]
xs [Person]
ys
person :: String -> String -> Person
person :: String -> String -> Person
person f :: String
f l :: String
l = String -> String -> [String] -> Conv -> Person
Person String
f String
l [] Conv
Western
person' :: String -> String -> Person
person' :: String -> String -> Person
person' s :: String
s g :: String
g = String -> String -> [String] -> Conv -> Person
Person String
g String
s [] Conv
Eastern
personWM :: String -> [String] -> String -> Person
personWM :: String -> [String] -> String -> Person
personWM f :: String
f ms :: [String]
ms l :: String
l = String -> String -> [String] -> Conv -> Person
Person String
f String
l [String]
ms Conv
Western
personWM' :: String -> [String] -> String -> Person
personWM' :: String -> [String] -> String -> Person
personWM' g :: String
g ms :: [String]
ms s :: String
s = String -> String -> [String] -> Conv -> Person
Person String
g String
s [String]
ms Conv
Eastern
mononym :: String -> Person
mononym :: String -> Person
mononym n :: String
n = String -> String -> [String] -> Conv -> Person
Person "NFN" String
n [] Conv
Mono
class HasName p where
nameStr :: p -> String
instance HasName Person where
nameStr :: Person -> String
nameStr (Person _ n :: String
n _ Mono) = String -> String
dotInitial String
n
nameStr (Person f :: String
f l :: String
l ms :: [String]
ms Western) = (String -> String -> String) -> String -> [String] -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr String -> String -> String
nameSep "" (
[String -> String
dotInitial String
f] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
dotInitial [String]
ms [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String -> String
dotInitial String
l])
nameStr (Person g :: String
g s :: String
s ms :: [String]
ms Eastern) = (String -> String -> String) -> String -> [String] -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr String -> String -> String
nameSep "" (
[String -> String
dotInitial String
s] [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
dotInitial [String]
ms [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String -> String
dotInitial String
g])
name :: (HasName n) => n -> String
name :: n -> String
name = n -> String
forall p. HasName p => p -> String
nameStr
lstName :: Person -> String
lstName :: Person -> String
lstName Person {_surname :: Person -> String
_surname = String
l} = String
l
rendPersLFM :: Person -> String
rendPersLFM :: Person -> String
rendPersLFM Person {_surname :: Person -> String
_surname = String
n, _convention :: Person -> Conv
_convention = Conv
Mono} = String
n
rendPersLFM Person {_given :: Person -> String
_given = String
f, _surname :: Person -> String
_surname = String
l, _middle :: Person -> [String]
_middle = [String]
ms} =
String -> String
dotInitial String
l String -> String -> String
`orderSep` String -> String
dotInitial String
f String -> String -> String
`nameSep`
(String -> String -> String) -> String -> [String] -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (String -> String -> String
nameSep (String -> String -> String)
-> (String -> String) -> String -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
dotInitial) "" [String]
ms
rendPersLFM' :: Person -> String
rendPersLFM' :: Person -> String
rendPersLFM' Person {_surname :: Person -> String
_surname = String
n, _convention :: Person -> Conv
_convention = Conv
Mono} = String
n
rendPersLFM' Person {_given :: Person -> String
_given = String
f, _surname :: Person -> String
_surname = String
l, _middle :: Person -> [String]
_middle = [String]
ms} =
String -> String
dotInitial String
l String -> String -> String
`orderSep` (String -> String -> String) -> String -> [String] -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (String -> String -> String
nameSep (String -> String -> String)
-> (String -> String) -> String -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
initial) "" (String
fString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
ms)
rendPersLFM'' :: Person -> String
rendPersLFM'' :: Person -> String
rendPersLFM'' Person {_surname :: Person -> String
_surname = String
n, _convention :: Person -> Conv
_convention = Conv
Mono} = String
n
rendPersLFM'' Person {_given :: Person -> String
_given = String
f, _surname :: Person -> String
_surname = String
l, _middle :: Person -> [String]
_middle = [String]
ms} =
String -> String
dotInitial String
l String -> String -> String
`orderSep` (String -> String -> String) -> [String] -> String
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 String -> String -> String
nameSep (String -> String
dotInitial String
f String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
initial [String]
ms)
initial :: String -> String
initial :: String -> String
initial [] = []
initial (x :: Char
x:_) = [Char
x , '.']
dotInitial :: String -> String
dotInitial :: String -> String
dotInitial [x :: Char
x] = [Char
x,'.']
dotInitial nm :: String
nm = String
nm
joiner :: String -> String -> String -> String
joiner :: String -> String -> String -> String
joiner _ a :: String
a "" = String
a
joiner _ "" b :: String
b = String
b
joiner j :: String
j a :: String
a b :: String
b = String
a String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
j String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
b
orderSep :: String -> String -> String
orderSep :: String -> String -> String
orderSep = String -> String -> String -> String
joiner ", "
nameSep :: String -> String -> String
nameSep :: String -> String -> String
nameSep = String -> String -> String -> String
joiner " "