asif-3.0.0: src/Arbor/File/Format/Asif/ByIndex.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
module Arbor.File.Format.Asif.ByIndex
( ByIndex(..)
) where
import Data.Monoid ((<>))
import qualified Data.Semigroup as S
newtype ByIndex a = ByIndex
{ unByIndex :: [a]
} deriving (Eq, Show)
instance (Monoid a, S.Semigroup a) => S.Semigroup (ByIndex a) where
ByIndex as <> ByIndex bs = ByIndex (appendByIndex as bs)
instance (Monoid a, S.Semigroup a) => Monoid (ByIndex a) where
mappend = (S.<>)
mempty = ByIndex []
appendByIndex :: Monoid a => [a] -> [a] -> [a]
appendByIndex (a:as) (b:bs) = (a `mappend` b):appendByIndex as bs
appendByIndex (a:as) bs = a :appendByIndex as bs
appendByIndex as (b:bs) = b :appendByIndex as bs
appendByIndex [] [] = []