data DList a = DList [a] empty :: DList a empty = DList [] member :: Eq a => a -> DList a -> Bool member x (DList xs) = x `elem` xs insert :: Eq a => a -> DList a -> DList a insert x a@(DList xs) | member x a = a | otherwise = DList $ x : xs remove :: Eq a => a -> DList a -> DList a remove x a@(DList xs) = case span (/= x) xs of (_, []) -> a (first, _ : last) -> DList $ first ++ last