---------------------------------------------------------------------
---Module      :   ListForms
-- a naive and simple data type for monoids
-- somewhat the minimum often used without much baggage
--
----------------------------------------------------------------------
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}

{-# OPTIONS -Wall #-}

module Uniform.ListForm
  ( module Uniform.ListForm,
    module Uniform.Zero 
  )
where

import Uniform.Zero ( Zeros )

class (Monoid l, Zeros (LF l)) => ListForms l where
  type LF l
  prependOne :: LF l -> l -> l
  appendOne :: l -> LF l -> l
  mkOne :: LF l -> l
  appendTwo :: l -> l -> l

  prependOne LF l
a l
la = forall l. ListForms l => l -> l -> l
appendTwo (forall l. ListForms l => LF l -> l
mkOne LF l
a) l
la
  appendOne l
la LF l
a = forall l. ListForms l => l -> l -> l
appendTwo l
la (forall l. ListForms l => LF l -> l
mkOne LF l
a)
  appendTwo = forall a. HasCallStack => [Char] -> a
error [Char]
"not implemented appendTwo for ListForm (<>)"