{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Client.Internal.Utils
  ( removeDuplicates,
    isEnum,
  )
where

import Data.Morpheus.Client.Internal.Types
  ( ClientConstructorDefinition (cFields),
  )
import Relude

removeDuplicates :: Eq a => [a] -> [a]
removeDuplicates :: [a] -> [a]
removeDuplicates = ([a], [a]) -> [a]
forall a b. (a, b) -> a
fst (([a], [a]) -> [a]) -> ([a] -> ([a], [a])) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> ([a], [a])
forall a. Eq a => [a] -> ([a], [a])
splitDuplicates

splitDuplicates :: Eq a => [a] -> ([a], [a])
splitDuplicates :: [a] -> ([a], [a])
splitDuplicates = ([a], [a]) -> [a] -> ([a], [a])
forall a. Eq a => ([a], [a]) -> [a] -> ([a], [a])
collectElems ([], [])
  where
    collectElems :: Eq a => ([a], [a]) -> [a] -> ([a], [a])
    collectElems :: ([a], [a]) -> [a] -> ([a], [a])
collectElems ([a], [a])
collected [] = ([a], [a])
collected
    collectElems ([a]
collected, [a]
errors) (a
x : [a]
xs)
      | a
x a -> [a] -> Bool
forall (f :: * -> *) a.
(Foldable f, DisallowElem f, Eq a) =>
a -> f a -> Bool
`elem` [a]
collected = ([a], [a]) -> [a] -> ([a], [a])
forall a. Eq a => ([a], [a]) -> [a] -> ([a], [a])
collectElems ([a]
collected, [a]
errors [a] -> [a] -> [a]
forall a. Semigroup a => a -> a -> a
<> [a
x]) [a]
xs
      | Bool
otherwise = ([a], [a]) -> [a] -> ([a], [a])
forall a. Eq a => ([a], [a]) -> [a] -> ([a], [a])
collectElems ([a]
collected [a] -> [a] -> [a]
forall a. Semigroup a => a -> a -> a
<> [a
x], [a]
errors) [a]
xs

isEnum :: [ClientConstructorDefinition] -> Bool
isEnum :: [ClientConstructorDefinition] -> Bool
isEnum = (ClientConstructorDefinition -> Bool)
-> [ClientConstructorDefinition] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ([FieldDefinition ANY VALID] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([FieldDefinition ANY VALID] -> Bool)
-> (ClientConstructorDefinition -> [FieldDefinition ANY VALID])
-> ClientConstructorDefinition
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClientConstructorDefinition -> [FieldDefinition ANY VALID]
cFields)