{-# LANGUAGE OverloadedStrings #-}
module Circuit.Agent.Mark
( Mark (..),
markGlyph,
parseMark,
markOf,
isHalt,
isEscalate,
)
where
import Circuit.Agent (Post (..))
import Data.Text (Text)
import Data.Text qualified as T
data Mark
=
Motion
|
Consent
|
Amendment
|
Escalate
|
Landed
|
StandDown
deriving (Mark -> Mark -> Bool
(Mark -> Mark -> Bool) -> (Mark -> Mark -> Bool) -> Eq Mark
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Mark -> Mark -> Bool
== :: Mark -> Mark -> Bool
$c/= :: Mark -> Mark -> Bool
/= :: Mark -> Mark -> Bool
Eq, Eq Mark
Eq Mark =>
(Mark -> Mark -> Ordering)
-> (Mark -> Mark -> Bool)
-> (Mark -> Mark -> Bool)
-> (Mark -> Mark -> Bool)
-> (Mark -> Mark -> Bool)
-> (Mark -> Mark -> Mark)
-> (Mark -> Mark -> Mark)
-> Ord Mark
Mark -> Mark -> Bool
Mark -> Mark -> Ordering
Mark -> Mark -> Mark
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Mark -> Mark -> Ordering
compare :: Mark -> Mark -> Ordering
$c< :: Mark -> Mark -> Bool
< :: Mark -> Mark -> Bool
$c<= :: Mark -> Mark -> Bool
<= :: Mark -> Mark -> Bool
$c> :: Mark -> Mark -> Bool
> :: Mark -> Mark -> Bool
$c>= :: Mark -> Mark -> Bool
>= :: Mark -> Mark -> Bool
$cmax :: Mark -> Mark -> Mark
max :: Mark -> Mark -> Mark
$cmin :: Mark -> Mark -> Mark
min :: Mark -> Mark -> Mark
Ord, Int -> Mark -> ShowS
[Mark] -> ShowS
Mark -> String
(Int -> Mark -> ShowS)
-> (Mark -> String) -> ([Mark] -> ShowS) -> Show Mark
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Mark -> ShowS
showsPrec :: Int -> Mark -> ShowS
$cshow :: Mark -> String
show :: Mark -> String
$cshowList :: [Mark] -> ShowS
showList :: [Mark] -> ShowS
Show, Int -> Mark
Mark -> Int
Mark -> [Mark]
Mark -> Mark
Mark -> Mark -> [Mark]
Mark -> Mark -> Mark -> [Mark]
(Mark -> Mark)
-> (Mark -> Mark)
-> (Int -> Mark)
-> (Mark -> Int)
-> (Mark -> [Mark])
-> (Mark -> Mark -> [Mark])
-> (Mark -> Mark -> [Mark])
-> (Mark -> Mark -> Mark -> [Mark])
-> Enum Mark
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 :: Mark -> Mark
succ :: Mark -> Mark
$cpred :: Mark -> Mark
pred :: Mark -> Mark
$ctoEnum :: Int -> Mark
toEnum :: Int -> Mark
$cfromEnum :: Mark -> Int
fromEnum :: Mark -> Int
$cenumFrom :: Mark -> [Mark]
enumFrom :: Mark -> [Mark]
$cenumFromThen :: Mark -> Mark -> [Mark]
enumFromThen :: Mark -> Mark -> [Mark]
$cenumFromTo :: Mark -> Mark -> [Mark]
enumFromTo :: Mark -> Mark -> [Mark]
$cenumFromThenTo :: Mark -> Mark -> Mark -> [Mark]
enumFromThenTo :: Mark -> Mark -> Mark -> [Mark]
Enum, Mark
Mark -> Mark -> Bounded Mark
forall a. a -> a -> Bounded a
$cminBound :: Mark
minBound :: Mark
$cmaxBound :: Mark
maxBound :: Mark
Bounded)
markGlyph :: Mark -> Text
markGlyph :: Mark -> Text
markGlyph = \case
Mark
Motion -> Text
"\x1F7E1"
Mark
Consent -> Text
"\x2713"
Mark
Amendment -> Text
"\x21A9"
Mark
Escalate -> Text
"\x1F534"
Mark
Landed -> Text
"\x1F7E2"
Mark
StandDown -> Text
"\x1F535"
parseMark :: Text -> Maybe Mark
parseMark :: Text -> Maybe Mark
parseMark Text
t = [Mark] -> Maybe Mark
go [Mark
forall a. Bounded a => a
minBound .. Mark
forall a. Bounded a => a
maxBound]
where
go :: [Mark] -> Maybe Mark
go [] = Maybe Mark
forall a. Maybe a
Nothing
go (Mark
m : [Mark]
ms)
| Text
glyph Text -> Text -> Bool
`T.isPrefixOf` Text
t = Mark -> Maybe Mark
forall a. a -> Maybe a
Just Mark
m
| (Text
glyph Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"\xFE0F") Text -> Text -> Bool
`T.isPrefixOf` Text
t = Mark -> Maybe Mark
forall a. a -> Maybe a
Just Mark
m
| Bool
otherwise = [Mark] -> Maybe Mark
go [Mark]
ms
where
glyph :: Text
glyph = Mark -> Text
markGlyph Mark
m
markOf :: Post Text -> Maybe Mark
markOf :: Post Text -> Maybe Mark
markOf = Text -> Maybe Mark
parseMark (Text -> Maybe Mark)
-> (Post Text -> Text) -> Post Text -> Maybe Mark
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Post Text -> Text
forall a. Post a -> a
body
isHalt :: Mark -> Bool
isHalt :: Mark -> Bool
isHalt = \case
Mark
Landed -> Bool
True
Mark
StandDown -> Bool
True
Mark
_ -> Bool
False
isEscalate :: Mark -> Bool
isEscalate :: Mark -> Bool
isEscalate = (Mark -> Mark -> Bool
forall a. Eq a => a -> a -> Bool
== Mark
Escalate)