module Data.Sequence.Extra
  ( separate
  ) where

import Data.Sequence (Seq, (|>), empty)

separate :: (a -> Either b c) -> Seq a -> (Seq b, Seq c)
separate :: (a -> Either b c) -> Seq a -> (Seq b, Seq c)
separate a -> Either b c
f = ((Seq b, Seq c) -> a -> (Seq b, Seq c))
-> (Seq b, Seq c) -> Seq a -> (Seq b, Seq c)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (Seq b, Seq c) -> a -> (Seq b, Seq c)
g (Seq b
forall a. Seq a
empty, Seq c
forall a. Seq a
empty)
  where
    g :: (Seq b, Seq c) -> a -> (Seq b, Seq c)
g (Seq b
bs, Seq c
cs) a
a =
      case a -> Either b c
f a
a of
        Left b
b -> (Seq b
bs Seq b -> b -> Seq b
forall a. Seq a -> a -> Seq a
|> b
b, Seq c
cs)
        Right c
c -> (Seq b
bs, Seq c
cs Seq c -> c -> Seq c
forall a. Seq a -> a -> Seq a
|> c
c)