module Text.XML.DOM.Parser.Buildable
  ( Buildable(..)
  ) where

import Data.Functor.Identity
import Data.List.NonEmpty as NE
import Data.Maybe

-- | Class of traversable functors which may be constructed from list
class Traversable f => Buildable f where
  -- | If method return Nothing this means we can not build
  -- traversable from given list. In this case 'inFilteredTrav' should
  -- fail traversing.
  build :: [a] ->  Maybe (f a)

instance Buildable Identity where
  build :: forall a. [a] -> Maybe (Identity a)
build = (a -> Identity a) -> Maybe a -> Maybe (Identity a)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Identity a
forall a. a -> Identity a
Identity (Maybe a -> Maybe (Identity a))
-> ([a] -> Maybe a) -> [a] -> Maybe (Identity a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe

instance Buildable [] where
  build :: forall a. [a] -> Maybe [a]
build = [a] -> Maybe [a]
forall a. a -> Maybe a
Just

instance Buildable Maybe where
  build :: forall a. [a] -> Maybe (Maybe a)
build = Maybe a -> Maybe (Maybe a)
forall a. a -> Maybe a
Just (Maybe a -> Maybe (Maybe a))
-> ([a] -> Maybe a) -> [a] -> Maybe (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Maybe a
forall a. [a] -> Maybe a
listToMaybe

instance Buildable NonEmpty where
  build :: forall a. [a] -> Maybe (NonEmpty a)
build = [a] -> Maybe (NonEmpty a)
forall a. [a] -> Maybe (NonEmpty a)
NE.nonEmpty