{-# LANGUAGE GADTs, NoImplicitPrelude, UnicodeSyntax #-}

module Data.Nested.Forest
       ( -- * Forest type
         Forest
         -- * Query
       , trees, treeAssocs
       , null, size
       , lookup, member
         -- * Construction
       , empty
       , singleton
       , fromFoldable
       , fromList
         -- * List
       , toList
       ) where

import Data.Function (flip)
import Data.Maybe (Maybe)
import Data.Ord (Ord)
import Data.Int (Int)
import Data.Bool (Bool)
import Data.Foldable (Foldable)
import Data.Traversable (Traversable)
import Data.Nested.Internal ( Forest
                            , trees, treeAssocs
                            , nullForest
                            , sizeForest
                            , emptyForest
                            , singletonForest
                            , fromFoldableForest
                            , fromListForest
                            , toListForest
                            , lookupForest
                            , memberForest                              
                            )

empty  Forest κ α
empty = emptyForest

null  Forest κ α  Bool
null = nullForest

size  Forest κ α  Int
size = sizeForest

singleton  Foldable φ  φ (κ,α)  Forest κ α
singleton = singletonForest

fromFoldable  (Foldable φ, Foldable ψ, Ord κ)  ψ (φ (κ, α))  Forest κ α
fromFoldable = fromFoldableForest

fromList  (Ord κ)  [[(κ, α)]]  Forest κ α
fromList = fromListForest

toList  Forest κ α  [[(κ, α)]]
toList = toListForest

lookup  (Traversable φ, Ord κ)  φ κ  Forest κ α  φ (Maybe α)
lookup = flip lookupForest

member  (Traversable φ, Ord κ)  φ κ  Forest κ α  φ Bool
member = flip memberForest