-- Copyright (c) 2015 Eric McCorkle.  All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
--
-- 1. Redistributions of source code must retain the above copyright
--    notice, this list of conditions and the following disclaimer.
--
-- 2. Redistributions in binary form must reproduce the above copyright
--    notice, this list of conditions and the following disclaimer in the
--    documentation and/or other materials provided with the distribution.
--
-- 3. Neither the name of the author nor the names of any contributors
--    may be used to endorse or promote products derived from this software
--    without specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS''
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-- USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-- OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-- SUCH DAMAGE.
{-# OPTIONS_GHC -funbox-strict-fields -Wall -Werror #-}
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses,
             FunctionalDependencies #-}

-- | Defines datatype for information about source element positions.
module Data.Position.Class(
       PositionInfo(..),
       Position(..)
       ) where

import Control.Monad.Positions.Class
import Data.ByteString(ByteString)
import Data.Position.Filename
import Data.Position.Point

-- | A typeclass representing information available about 'Position'
-- instances.  This is used to traverse whatever striucture the
-- 'Position' instance may have.
class PositionInfo info where
  -- | Get the filename and offsets, if they exist.
  location :: MonadPositions m =>
              info -> m (Maybe (Filename, Maybe (Point, Point)))
  -- | Children of this @PositionInfo@  All titles lines will be indented.
  children :: info -> Maybe (ByteString, [info])
  -- | Whether or not to show source context as well.  Note that
  -- source context is omitted for some message rendering modes.
  showContext :: info -> Bool
  description :: info -> ByteString

-- | A typeclass representing a position.
class Position info pos | pos -> info where
  -- | Get a 'PositionInfo' instance to traverse this 'Position'.
  positionInfo :: pos -> [info]
