module Gargantext.Utils.Either where

import Gargantext.Prelude

import Data.Array (cons, uncons)
import Data.Either (Either(..))
import Data.Map as Map
import Data.Maybe (Maybe(..))
import Data.Tuple (Tuple(..))

eitherList :: forall l r. Array (Either l r) -> Either l (Array r)
eitherList xs = case uncons xs of
  Nothing -> Right []
  Just { head: Left x } -> Left x
  Just { head: Right x, tail } ->
    case eitherList tail of
      Left err -> Left err
      Right ds -> Right (cons x ds)


eitherMap :: forall k l r. Ord k => Map.Map k (Either l r) -> Either l (Map.Map k r)
eitherMap m = case eitherList (helper <$> Map.toUnfoldable m) of
  Left err  -> Left err
  Right lst -> Right $ Map.fromFoldable lst
  where
    helper (Tuple _ (Left err)) = Left err
    helper (Tuple k (Right v)) = Right (Tuple k v)