module Asana.Api.Task
  ( Task (..),
    Membership (..),
    TaskStatusFilter (..),
    ResourceSubtype (..),
    PostTask (..),
    getTask,
    getProjectTasks,
    getProjectTasksCompletedSince,
    postTask,
    addTag,
    putCompleted,
    taskUrl,
    extractNumberField,
    extractEnumField,
  )
where

import Asana.Api.CustomField
import Asana.Api.Gid
import Asana.Api.Named
import Asana.Api.Prelude
import Asana.Api.Request
import Asana.Api.Tag
import Data.Aeson
import Data.Aeson.Casing (aesonPrefix, snakeCase)
import Data.HashMap.Strict (HashMap)
import qualified Data.Text as T
import Data.Time (UTCTime, getCurrentTime)
import Data.Time.ISO8601 (formatISO8601)

data Membership = Membership
  { Membership -> Named
mProject :: Named,
    Membership -> Maybe Named
mSection :: Maybe Named
  }
  deriving stock (Membership -> Membership -> Bool
(Membership -> Membership -> Bool)
-> (Membership -> Membership -> Bool) -> Eq Membership
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Membership -> Membership -> Bool
== :: Membership -> Membership -> Bool
$c/= :: Membership -> Membership -> Bool
/= :: Membership -> Membership -> Bool
Eq, (forall x. Membership -> Rep Membership x)
-> (forall x. Rep Membership x -> Membership) -> Generic Membership
forall x. Rep Membership x -> Membership
forall x. Membership -> Rep Membership x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Membership -> Rep Membership x
from :: forall x. Membership -> Rep Membership x
$cto :: forall x. Rep Membership x -> Membership
to :: forall x. Rep Membership x -> Membership
Generic, Int -> Membership -> ShowS
[Membership] -> ShowS
Membership -> String
(Int -> Membership -> ShowS)
-> (Membership -> String)
-> ([Membership] -> ShowS)
-> Show Membership
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Membership -> ShowS
showsPrec :: Int -> Membership -> ShowS
$cshow :: Membership -> String
show :: Membership -> String
$cshowList :: [Membership] -> ShowS
showList :: [Membership] -> ShowS
Show)

instance FromJSON Membership where
  parseJSON :: Value -> Parser Membership
parseJSON = Options -> Value -> Parser Membership
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON (Options -> Value -> Parser Membership)
-> Options -> Value -> Parser Membership
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase

data ResourceSubtype = DefaultTask | Milestone | Section
  deriving stock (ResourceSubtype -> ResourceSubtype -> Bool
(ResourceSubtype -> ResourceSubtype -> Bool)
-> (ResourceSubtype -> ResourceSubtype -> Bool)
-> Eq ResourceSubtype
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ResourceSubtype -> ResourceSubtype -> Bool
== :: ResourceSubtype -> ResourceSubtype -> Bool
$c/= :: ResourceSubtype -> ResourceSubtype -> Bool
/= :: ResourceSubtype -> ResourceSubtype -> Bool
Eq, (forall x. ResourceSubtype -> Rep ResourceSubtype x)
-> (forall x. Rep ResourceSubtype x -> ResourceSubtype)
-> Generic ResourceSubtype
forall x. Rep ResourceSubtype x -> ResourceSubtype
forall x. ResourceSubtype -> Rep ResourceSubtype x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ResourceSubtype -> Rep ResourceSubtype x
from :: forall x. ResourceSubtype -> Rep ResourceSubtype x
$cto :: forall x. Rep ResourceSubtype x -> ResourceSubtype
to :: forall x. Rep ResourceSubtype x -> ResourceSubtype
Generic, Int -> ResourceSubtype -> ShowS
[ResourceSubtype] -> ShowS
ResourceSubtype -> String
(Int -> ResourceSubtype -> ShowS)
-> (ResourceSubtype -> String)
-> ([ResourceSubtype] -> ShowS)
-> Show ResourceSubtype
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ResourceSubtype -> ShowS
showsPrec :: Int -> ResourceSubtype -> ShowS
$cshow :: ResourceSubtype -> String
show :: ResourceSubtype -> String
$cshowList :: [ResourceSubtype] -> ShowS
showList :: [ResourceSubtype] -> ShowS
Show)

instance FromJSON ResourceSubtype where
  parseJSON :: Value -> Parser ResourceSubtype
parseJSON =
    Options -> Value -> Parser ResourceSubtype
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON (Options -> Value -> Parser ResourceSubtype)
-> Options -> Value -> Parser ResourceSubtype
forall a b. (a -> b) -> a -> b
$ Options
defaultOptions {constructorTagModifier = snakeCase}

data Task = Task
  { Task -> Maybe Named
tAssignee :: Maybe Named,
    Task -> Text
tName :: Text,
    Task -> Bool
tCompleted :: Bool,
    Task -> Maybe UTCTime
tCompletedAt :: Maybe UTCTime,
    Task -> UTCTime
tCreatedAt :: UTCTime,
    Task -> CustomFields
tCustomFields :: CustomFields,
    Task -> [Membership]
tMemberships :: [Membership],
    Task -> Gid
tGid :: Gid,
    Task -> ResourceSubtype
tResourceSubtype :: ResourceSubtype,
    Task -> Text
tNotes :: Text,
    Task -> [AsanaReference]
tProjects :: [AsanaReference],
    Task -> [Tag]
tTags :: [Tag]
  }
  deriving stock (Task -> Task -> Bool
(Task -> Task -> Bool) -> (Task -> Task -> Bool) -> Eq Task
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Task -> Task -> Bool
== :: Task -> Task -> Bool
$c/= :: Task -> Task -> Bool
/= :: Task -> Task -> Bool
Eq, (forall x. Task -> Rep Task x)
-> (forall x. Rep Task x -> Task) -> Generic Task
forall x. Rep Task x -> Task
forall x. Task -> Rep Task x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Task -> Rep Task x
from :: forall x. Task -> Rep Task x
$cto :: forall x. Rep Task x -> Task
to :: forall x. Rep Task x -> Task
Generic, Int -> Task -> ShowS
[Task] -> ShowS
Task -> String
(Int -> Task -> ShowS)
-> (Task -> String) -> ([Task] -> ShowS) -> Show Task
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Task -> ShowS
showsPrec :: Int -> Task -> ShowS
$cshow :: Task -> String
show :: Task -> String
$cshowList :: [Task] -> ShowS
showList :: [Task] -> ShowS
Show)

instance FromJSON Task where
  parseJSON :: Value -> Parser Task
parseJSON = Options -> Value -> Parser Task
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON (Options -> Value -> Parser Task)
-> Options -> Value -> Parser Task
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase

-- | Return all details for a task by id
getTask ::
  (MonadUnliftIO m, MonadLogger m, MonadReader env m, HasAsanaAccessKey env) =>
  Gid ->
  m Task
getTask :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env) =>
Gid -> m Task
getTask Gid
taskId = String -> m Task
forall (m :: * -> *) env a.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env, FromJSON a) =>
String -> m a
getSingle (String -> m Task) -> String -> m Task
forall a b. (a -> b) -> a -> b
$ String
"/tasks/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack (Gid -> Text
gidToText Gid
taskId)

data PostTask = PostTask
  { PostTask -> [Gid]
ptProjects :: [Gid],
    PostTask -> HashMap Gid Text
ptCustomFields :: HashMap Gid Text,
    PostTask -> Text
ptName :: Text,
    PostTask -> Text
ptNotes :: Text,
    PostTask -> Maybe Gid
ptParent :: Maybe Gid
  }
  deriving stock ((forall x. PostTask -> Rep PostTask x)
-> (forall x. Rep PostTask x -> PostTask) -> Generic PostTask
forall x. Rep PostTask x -> PostTask
forall x. PostTask -> Rep PostTask x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PostTask -> Rep PostTask x
from :: forall x. PostTask -> Rep PostTask x
$cto :: forall x. Rep PostTask x -> PostTask
to :: forall x. Rep PostTask x -> PostTask
Generic)

instance FromJSON PostTask where
  parseJSON :: Value -> Parser PostTask
parseJSON = Options -> Value -> Parser PostTask
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON (Options -> Value -> Parser PostTask)
-> Options -> Value -> Parser PostTask
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase

instance ToJSON PostTask where
  toJSON :: PostTask -> Value
toJSON = Options -> PostTask -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON (Options -> PostTask -> Value) -> Options -> PostTask -> Value
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase
  toEncoding :: PostTask -> Encoding
toEncoding = Options -> PostTask -> Encoding
forall a.
(Generic a, GToJSON' Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding (Options -> PostTask -> Encoding)
-> Options -> PostTask -> Encoding
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase

-- | Create a new 'Task'
postTask ::
  (MonadUnliftIO m, MonadLogger m, MonadReader env m, HasAsanaAccessKey env) =>
  PostTask ->
  m (Result Task)
postTask :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env) =>
PostTask -> m (Result Task)
postTask PostTask
body = (ApiData Task -> Task) -> Result (ApiData Task) -> Result Task
forall a b. (a -> b) -> Result a -> Result b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ApiData Task -> Task
forall a. ApiData a -> a
adData (Result (ApiData Task) -> Result Task)
-> (Value -> Result (ApiData Task)) -> Value -> Result Task
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Result (ApiData Task)
forall a. FromJSON a => Value -> Result a
fromJSON (Value -> Result Task) -> m Value -> m (Result Task)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ApiData PostTask -> m Value
forall (m :: * -> *) env a.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env, ToJSON a) =>
String -> a -> m Value
post String
"/tasks" (PostTask -> ApiData PostTask
forall a. a -> ApiData a
ApiData PostTask
body)

-- | Return compact task details for a project
--
-- Iterating ourselves and returning @['Task']@ is a better interface but
-- precludes us logging things each time we request an element. So we return
-- @'Named'@ for now and let the caller use @'getTask'@ themselves.
getProjectTasks ::
  (MonadUnliftIO m, MonadLogger m, MonadReader env m, HasAsanaAccessKey env) =>
  Gid ->
  TaskStatusFilter ->
  m [Named]
getProjectTasks :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env) =>
Gid -> TaskStatusFilter -> m [Named]
getProjectTasks Gid
projectId TaskStatusFilter
taskStatusFilter = do
  UTCTime
now <- IO UTCTime -> m UTCTime
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO UTCTime
getCurrentTime
  String -> [(String, String)] -> m [Named]
forall (m :: * -> *) env a.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env, FromJSON a) =>
String -> [(String, String)] -> m [a]
getAllParams
    (Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Text
"/projects/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Gid -> Text
gidToText Gid
projectId Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/tasks")
    (UTCTime -> [(String, String)]
completedSince UTCTime
now)
  where
    completedSince :: UTCTime -> [(String, String)]
completedSince UTCTime
now = case TaskStatusFilter
taskStatusFilter of
      TaskStatusFilter
AllTasks -> []
      TaskStatusFilter
IncompletedTasks -> [(String
"completed_since", UTCTime -> String
formatISO8601 UTCTime
now)]

data TaskStatusFilter = IncompletedTasks | AllTasks

getProjectTasksCompletedSince ::
  (MonadUnliftIO m, MonadLogger m, MonadReader env m, HasAsanaAccessKey env) =>
  Gid ->
  UTCTime ->
  m [Named]
getProjectTasksCompletedSince :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env) =>
Gid -> UTCTime -> m [Named]
getProjectTasksCompletedSince Gid
projectId UTCTime
since =
  String -> [(String, String)] -> m [Named]
forall (m :: * -> *) env a.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env, FromJSON a) =>
String -> [(String, String)] -> m [a]
getAllParams
    (Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Text
"/projects/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Gid -> Text
gidToText Gid
projectId Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/tasks")
    [(String
"completed_since", UTCTime -> String
formatISO8601 UTCTime
since)]

addTag ::
  (MonadUnliftIO m, MonadLogger m, MonadReader env m, HasAsanaAccessKey env) =>
  Gid ->
  -- | Tag
  Gid ->
  m ()
addTag :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env) =>
Gid -> Gid -> m ()
addTag Gid
task Gid
tag =
  m Value -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Value -> m ()) -> m Value -> m ()
forall a b. (a -> b) -> a -> b
$
    String -> ApiData Value -> m Value
forall (m :: * -> *) env a.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env, ToJSON a) =>
String -> a -> m Value
post (String
"/tasks/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack (Gid -> Text
gidToText Gid
task) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"/addTag") (ApiData Value -> m Value) -> ApiData Value -> m Value
forall a b. (a -> b) -> a -> b
$
      Value -> ApiData Value
forall a. a -> ApiData a
ApiData
        ([Pair] -> Value
object [Key
"tag" Key -> Gid -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Gid
tag])

putCompleted ::
  (MonadUnliftIO m, MonadLogger m, MonadReader env m, HasAsanaAccessKey env) =>
  Gid ->
  Bool ->
  m ()
putCompleted :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env) =>
Gid -> Bool -> m ()
putCompleted Gid
taskId Bool
completed =
  m Value -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Value -> m ()) -> m Value -> m ()
forall a b. (a -> b) -> a -> b
$
    String -> ApiData Value -> m Value
forall (m :: * -> *) env a.
(MonadUnliftIO m, MonadLogger m, MonadReader env m,
 HasAsanaAccessKey env, ToJSON a) =>
String -> a -> m Value
put (String
"/tasks/" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack (Gid -> Text
gidToText Gid
taskId)) (ApiData Value -> m Value) -> ApiData Value -> m Value
forall a b. (a -> b) -> a -> b
$
      Value -> ApiData Value
forall a. a -> ApiData a
ApiData
        ([Pair] -> Value
object [Key
"completed" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool
completed])

taskUrl :: Task -> Text
taskUrl :: Task -> Text
taskUrl Task {Bool
[AsanaReference]
[Tag]
[Membership]
Maybe UTCTime
Maybe Named
Text
UTCTime
Gid
CustomFields
ResourceSubtype
tAssignee :: Task -> Maybe Named
tName :: Task -> Text
tCompleted :: Task -> Bool
tCompletedAt :: Task -> Maybe UTCTime
tCreatedAt :: Task -> UTCTime
tCustomFields :: Task -> CustomFields
tMemberships :: Task -> [Membership]
tGid :: Task -> Gid
tResourceSubtype :: Task -> ResourceSubtype
tNotes :: Task -> Text
tProjects :: Task -> [AsanaReference]
tTags :: Task -> [Tag]
tAssignee :: Maybe Named
tName :: Text
tCompleted :: Bool
tCompletedAt :: Maybe UTCTime
tCreatedAt :: UTCTime
tCustomFields :: CustomFields
tMemberships :: [Membership]
tGid :: Gid
tResourceSubtype :: ResourceSubtype
tNotes :: Text
tProjects :: [AsanaReference]
tTags :: [Tag]
..} = Text
"https://app.asana.com/0/0/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Gid -> Text
gidToText Gid
tGid Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"/f"

extractNumberField :: Text -> Task -> Maybe CustomField
extractNumberField :: Text -> Task -> Maybe CustomField
extractNumberField Text
fieldName Task {Bool
[AsanaReference]
[Tag]
[Membership]
Maybe UTCTime
Maybe Named
Text
UTCTime
Gid
CustomFields
ResourceSubtype
tAssignee :: Task -> Maybe Named
tName :: Task -> Text
tCompleted :: Task -> Bool
tCompletedAt :: Task -> Maybe UTCTime
tCreatedAt :: Task -> UTCTime
tCustomFields :: Task -> CustomFields
tMemberships :: Task -> [Membership]
tGid :: Task -> Gid
tResourceSubtype :: Task -> ResourceSubtype
tNotes :: Task -> Text
tProjects :: Task -> [AsanaReference]
tTags :: Task -> [Tag]
tAssignee :: Maybe Named
tName :: Text
tCompleted :: Bool
tCompletedAt :: Maybe UTCTime
tCreatedAt :: UTCTime
tCustomFields :: CustomFields
tMemberships :: [Membership]
tGid :: Gid
tResourceSubtype :: ResourceSubtype
tNotes :: Text
tProjects :: [AsanaReference]
tTags :: [Tag]
..} =
  [CustomField] -> Maybe CustomField
forall a. [a] -> Maybe a
listToMaybe ([CustomField] -> Maybe CustomField)
-> [CustomField] -> Maybe CustomField
forall a b. (a -> b) -> a -> b
$ ((CustomField -> Maybe CustomField)
 -> [CustomField] -> [CustomField])
-> [CustomField]
-> (CustomField -> Maybe CustomField)
-> [CustomField]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (CustomField -> Maybe CustomField)
-> [CustomField] -> [CustomField]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (CustomFields -> [CustomField]
getCustomFields CustomFields
tCustomFields) ((CustomField -> Maybe CustomField) -> [CustomField])
-> (CustomField -> Maybe CustomField) -> [CustomField]
forall a b. (a -> b) -> a -> b
$ \case
    customField :: CustomField
customField@(CustomNumber Gid
_ Text
t Maybe Scientific
_) -> CustomField
customField CustomField -> Maybe () -> Maybe CustomField
forall a b. a -> Maybe b -> Maybe a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
fieldName)
    CustomField
_ -> Maybe CustomField
forall a. Maybe a
Nothing

extractEnumField :: Text -> Task -> Maybe CustomField
extractEnumField :: Text -> Task -> Maybe CustomField
extractEnumField Text
fieldName Task {Bool
[AsanaReference]
[Tag]
[Membership]
Maybe UTCTime
Maybe Named
Text
UTCTime
Gid
CustomFields
ResourceSubtype
tAssignee :: Task -> Maybe Named
tName :: Task -> Text
tCompleted :: Task -> Bool
tCompletedAt :: Task -> Maybe UTCTime
tCreatedAt :: Task -> UTCTime
tCustomFields :: Task -> CustomFields
tMemberships :: Task -> [Membership]
tGid :: Task -> Gid
tResourceSubtype :: Task -> ResourceSubtype
tNotes :: Task -> Text
tProjects :: Task -> [AsanaReference]
tTags :: Task -> [Tag]
tAssignee :: Maybe Named
tName :: Text
tCompleted :: Bool
tCompletedAt :: Maybe UTCTime
tCreatedAt :: UTCTime
tCustomFields :: CustomFields
tMemberships :: [Membership]
tGid :: Gid
tResourceSubtype :: ResourceSubtype
tNotes :: Text
tProjects :: [AsanaReference]
tTags :: [Tag]
..} =
  [CustomField] -> Maybe CustomField
forall a. [a] -> Maybe a
listToMaybe ([CustomField] -> Maybe CustomField)
-> [CustomField] -> Maybe CustomField
forall a b. (a -> b) -> a -> b
$ ((CustomField -> Maybe CustomField)
 -> [CustomField] -> [CustomField])
-> [CustomField]
-> (CustomField -> Maybe CustomField)
-> [CustomField]
forall a b c. (a -> b -> c) -> b -> a -> c
flip (CustomField -> Maybe CustomField)
-> [CustomField] -> [CustomField]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (CustomFields -> [CustomField]
getCustomFields CustomFields
tCustomFields) ((CustomField -> Maybe CustomField) -> [CustomField])
-> (CustomField -> Maybe CustomField) -> [CustomField]
forall a b. (a -> b) -> a -> b
$ \case
    customField :: CustomField
customField@(CustomEnum Gid
_ Text
t [EnumOption]
_ Maybe Text
_) ->
      if Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
fieldName then CustomField -> Maybe CustomField
forall a. a -> Maybe a
Just CustomField
customField else Maybe CustomField
forall a. Maybe a
Nothing
    CustomField
_ -> Maybe CustomField
forall a. Maybe a
Nothing