packages feed

changeset-containers-0.1.1: src/Data/Monoid/RightAction/Sequence.hs

module Data.Monoid.RightAction.Sequence where

-- base
import GHC.Generics (Generic)

-- containers
import Data.Sequence

-- changeset
import Data.Monoid.RightAction (RightAction (..))

{- | Insert or delete an element at either end of a 'Seq'.

To change an element in a 'Seq', see the indexed changes in [@changeset-lens@](hackage.haskell.org/package/changeset-lens).

The general purpose changes t'Control.Monad.Trans.Changeset.FilterableChange',
t'Control.Monad.Trans.Changeset.FilterableChanges', t'Control.Monad.Trans.Changeset.FilterableWithIndexChanges',
and t'Control.Monad.Trans.Changeset.AlignChanges' also apply to 'Seq'uences.
-}
data SeqChange a
  = -- | Prepend an element
    Cons a
  | -- | Append an element
    Snoc a
  | -- | Drop an element from the left
    Uncons
  | -- | Drop an element from the right
    Unsnoc
  deriving stock (Show, Read, Eq, Ord, Functor, Generic)

instance RightAction (SeqChange a) (Seq a) where
  actRight s (Cons a) = a <| s
  actRight s (Snoc a) = s |> a
  actRight s Uncons = case viewl s of
    EmptyL -> empty
    _ :< as' -> as'
  actRight s Unsnoc = case viewr s of
    EmptyR -> empty
    as' :> _ -> as'