{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Ext.Elems
  ( Elems (..),
    size,
  )
where

import qualified Data.HashMap.Lazy as HM
import Instances.TH.Lift ()
import Relude

class Elems a coll | coll -> a where
  elems :: coll -> [a]

instance Elems a (HashMap k a) where
  elems :: HashMap k a -> [a]
elems = HashMap k a -> [a]
forall k v. HashMap k v -> [v]
HM.elems

instance Elems a [a] where
  elems :: [a] -> [a]
elems = [a] -> [a]
forall a. a -> a
id

size :: Elems a coll => coll -> Int
size :: coll -> Int
size = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([a] -> Int) -> (coll -> [a]) -> coll -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. coll -> [a]
forall a coll. Elems a coll => coll -> [a]
elems