packages feed

todos-0.1: ConstrSet.hs

{-# LANGUAGE UnicodeSyntax, DeriveDataTypeable, NoMonomorphismRestriction #-}

module ConstrSet 
  (CSet,
   empty,
   fromList, toList,
   insert, append,
   elemC,
   selectByConstrOf,
   selectByConstrOf'
  ) where

import Data.Generics
import Data.Function (on)
import Data.List (nubBy)
import Data.Maybe (fromMaybe)

teq = (==) `on` toConstr

data (Data a) ⇒ CSet a = CSet [a]

empty = CSet []

fromList lst = CSet $ nubBy teq lst
toList (CSet lst) = lst

insert item (CSet []) = CSet [item]
insert item (CSet lst) = CSet $ nubBy teq (item:lst)

selectByConstrOf (CSet []) _ = Nothing
selectByConstrOf (CSet (x:xs)) y | x `teq` y = Just x
                                 | otherwise = selectByConstrOf (CSet xs) y

selectByConstrOf' def cset x = fromMaybe def $ selectByConstrOf cset x

elemC _ (CSet []) = False
elemC x (CSet (y:ys)) | x `teq` y = True
                      | otherwise = elemC x (CSet ys)

append (CSet xs) (CSet ys) = CSet $ nubBy teq (xs++ys)