{-# LANGUAGE NoImplicitPrelude #-}

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

import Data.Morpheus.Types.Internal.AST
  ( ConsD (..),
  )
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

-- elems -> (unique elements, duplicate elems)
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 :: [ConsD f] -> Bool
isEnum :: [ConsD f] -> Bool
isEnum = (ConsD f -> Bool) -> [ConsD f] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ([f] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([f] -> Bool) -> (ConsD f -> [f]) -> ConsD f -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConsD f -> [f]
forall f. ConsD f -> [f]
cFields)