{-# LANGUAGE DeriveGeneric #-}
module Epidemic.Types.Population
( Person(Person)
, People(People)
, Population(..)
, Identifier(Identifier)
, asPeople
, includesPerson
, haveCommonPeople
, nullPeople
, numPeople
, addPerson
, removePerson
, personByteString
) where
import qualified Data.Aeson as Json
import qualified Data.ByteString.Builder as BBuilder
import qualified Data.Vector as V
import GHC.Generics
class Population a where
susceptiblePeople :: a -> Maybe People
infectiousPeople :: a -> Maybe People
removedPeople :: a -> Maybe People
isInfected :: a -> Bool
newtype Identifier =
Identifier Integer
deriving (Int -> Identifier -> ShowS
[Identifier] -> ShowS
Identifier -> String
(Int -> Identifier -> ShowS)
-> (Identifier -> String)
-> ([Identifier] -> ShowS)
-> Show Identifier
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Identifier] -> ShowS
$cshowList :: [Identifier] -> ShowS
show :: Identifier -> String
$cshow :: Identifier -> String
showsPrec :: Int -> Identifier -> ShowS
$cshowsPrec :: Int -> Identifier -> ShowS
Show, (forall x. Identifier -> Rep Identifier x)
-> (forall x. Rep Identifier x -> Identifier) -> Generic Identifier
forall x. Rep Identifier x -> Identifier
forall x. Identifier -> Rep Identifier x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Identifier x -> Identifier
$cfrom :: forall x. Identifier -> Rep Identifier x
Generic, Identifier -> Identifier -> Bool
(Identifier -> Identifier -> Bool)
-> (Identifier -> Identifier -> Bool) -> Eq Identifier
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Identifier -> Identifier -> Bool
$c/= :: Identifier -> Identifier -> Bool
== :: Identifier -> Identifier -> Bool
$c== :: Identifier -> Identifier -> Bool
Eq)
instance Json.FromJSON Identifier
instance Json.ToJSON Identifier
newtype Person =
Person Identifier
deriving (Int -> Person -> ShowS
[Person] -> ShowS
Person -> String
(Int -> Person -> ShowS)
-> (Person -> String) -> ([Person] -> ShowS) -> Show Person
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Person] -> ShowS
$cshowList :: [Person] -> ShowS
show :: Person -> String
$cshow :: Person -> String
showsPrec :: Int -> Person -> ShowS
$cshowsPrec :: Int -> Person -> ShowS
Show, (forall x. Person -> Rep Person x)
-> (forall x. Rep Person x -> Person) -> Generic Person
forall x. Rep Person x -> Person
forall x. Person -> Rep Person x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Person x -> Person
$cfrom :: forall x. Person -> Rep Person x
Generic, 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)
instance Json.FromJSON Person
instance Json.ToJSON Person
newtype People =
People (V.Vector Person)
deriving (Int -> People -> ShowS
[People] -> ShowS
People -> String
(Int -> People -> ShowS)
-> (People -> String) -> ([People] -> ShowS) -> Show People
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [People] -> ShowS
$cshowList :: [People] -> ShowS
show :: People -> String
$cshow :: People -> String
showsPrec :: Int -> People -> ShowS
$cshowsPrec :: Int -> People -> ShowS
Show, People -> People -> Bool
(People -> People -> Bool)
-> (People -> People -> Bool) -> Eq People
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: People -> People -> Bool
$c/= :: People -> People -> Bool
== :: People -> People -> Bool
$c== :: People -> People -> Bool
Eq, (forall x. People -> Rep People x)
-> (forall x. Rep People x -> People) -> Generic People
forall x. Rep People x -> People
forall x. People -> Rep People x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep People x -> People
$cfrom :: forall x. People -> Rep People x
Generic)
instance Json.FromJSON People
instance Json.ToJSON People
asPeople :: [Person] -> People
asPeople :: [Person] -> People
asPeople [Person]
persons = Vector Person -> People
People (Vector Person -> People) -> Vector Person -> People
forall a b. (a -> b) -> a -> b
$ [Person] -> Vector Person
forall a. [a] -> Vector a
V.fromList [Person]
persons
includesPerson :: People -> Person -> Bool
includesPerson :: People -> Person -> Bool
includesPerson (People Vector Person
persons) Person
person = Person -> Vector Person -> Bool
forall a. Eq a => a -> Vector a -> Bool
V.elem Person
person Vector Person
persons
haveCommonPeople :: People -> People -> Bool
haveCommonPeople :: People -> People -> Bool
haveCommonPeople (People Vector Person
ps1) (People Vector Person
ps2) = (Person -> Bool) -> Vector Person -> Bool
forall a. (a -> Bool) -> Vector a -> Bool
V.any (Person -> Vector Person -> Bool
forall a. Eq a => a -> Vector a -> Bool
`V.elem` Vector Person
ps2) Vector Person
ps1
nullPeople :: People -> Bool
nullPeople :: People -> Bool
nullPeople (People Vector Person
persons) = Vector Person -> Bool
forall a. Vector a -> Bool
V.null Vector Person
persons
numPeople :: People -> Int
numPeople :: People -> Int
numPeople (People Vector Person
persons) = Vector Person -> Int
forall a. Vector a -> Int
V.length Vector Person
persons
addPerson :: Person -> People -> People
addPerson :: Person -> People -> People
addPerson Person
person (People Vector Person
persons) = Vector Person -> People
People (Vector Person -> People) -> Vector Person -> People
forall a b. (a -> b) -> a -> b
$ Person -> Vector Person -> Vector Person
forall a. a -> Vector a -> Vector a
V.cons Person
person Vector Person
persons
removePerson :: Person -> People -> People
removePerson :: Person -> People -> People
removePerson Person
person (People Vector Person
persons) = Vector Person -> People
People (Vector Person -> People) -> Vector Person -> People
forall a b. (a -> b) -> a -> b
$ (Person -> Bool) -> Vector Person -> Vector Person
forall a. (a -> Bool) -> Vector a -> Vector a
V.filter (Person -> Person -> Bool
forall a. Eq a => a -> a -> Bool
/= Person
person) Vector Person
persons
personByteString :: Person -> BBuilder.Builder
personByteString :: Person -> Builder
personByteString (Person (Identifier Integer
n)) = Integer -> Builder
BBuilder.integerDec Integer
n