{-# LANGUAGE TupleSections #-}

module TOML.Utils.NonEmpty (
  zipHistory,
) where

import Data.List (scanl')
import Data.List.NonEmpty (NonEmpty ((:|)))
import qualified Data.List.NonEmpty as NonEmpty

{- |
Annotates each element with the history of all past elements.

>>> zipHistory ["a", "b", "c"]
[(["a"], "a"), (["a", "b"], "b"), (["a", "b", "c"], "c")]
-}
zipHistory :: NonEmpty a -> NonEmpty (NonEmpty a, a)
zipHistory :: NonEmpty a -> NonEmpty (NonEmpty a, a)
zipHistory (a
a :| [a]
as) =
  [(NonEmpty a, a)] -> NonEmpty (NonEmpty a, a)
forall a. [a] -> NonEmpty a
NonEmpty.fromList ([(NonEmpty a, a)] -> NonEmpty (NonEmpty a, a))
-> [(NonEmpty a, a)] -> NonEmpty (NonEmpty a, a)
forall a b. (a -> b) -> a -> b
$
    ((NonEmpty a, a) -> a -> (NonEmpty a, a))
-> (NonEmpty a, a) -> [a] -> [(NonEmpty a, a)]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl'
      (\(NonEmpty a
history, a
_) a
x -> (NonEmpty a -> a -> NonEmpty a
forall a. NonEmpty a -> a -> NonEmpty a
append NonEmpty a
history a
x, a
x))
      (a -> NonEmpty a
forall a. a -> NonEmpty a
singleton a
a, a
a)
      [a]
as
  where
    append :: NonEmpty a -> a -> NonEmpty a
append NonEmpty a
xs a
x = NonEmpty a
xs NonEmpty a -> NonEmpty a -> NonEmpty a
forall a. Semigroup a => a -> a -> a
<> a -> NonEmpty a
forall a. a -> NonEmpty a
singleton a
x
    -- NonEmpty.singleton was added in base 4.15
    singleton :: a -> NonEmpty a
singleton a
x = a
x a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| []