packages feed

language-ocaml-0.1.31: lib/Language/OCaml/Definitions/Parsing/ASTHelper/Str.hs

{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RecordWildCards #-}

module Language.OCaml.Definitions.Parsing.ASTHelper.Str
  ( AttributeOpts(..)
  , MkOpts(..)
  , attribute
  , mk
  , text
  ) where

import Data.Default

import Language.OCaml.Definitions.Parsing.ASTHelper.Common
import Language.OCaml.Definitions.Parsing.Docstrings
import Language.OCaml.Definitions.Parsing.ParseTree
import Language.OCaml.Definitions.Parsing.Location

attribute :: AttributeOpts -> Attribute -> StructureItem
attribute (AttributeOpts {..}) a = mk (def { loc }) (PstrAttribute a)

data AttributeOpts = AttributeOpts
  { loc :: Location
  }

instance Default AttributeOpts where
  def = AttributeOpts
    { loc = defaultLoc
    }

mk :: MkOpts -> StructureItemDesc -> StructureItem
mk (MkOpts {..}) d =
  StructureItem
  { pstrDesc = d
  , pstrLoc  = loc
  }

data MkOpts = MkOpts
  { loc :: Location
  }

instance Default MkOpts where
  def = MkOpts
    { loc = defaultLoc
    }

text :: [Docstring] -> [StructureItem]
text txt =
  let fTxt = filter (\ ds -> docstringBody ds /= "") txt in
  map (\ ds -> attribute (def { loc = docstringLoc ds }) (textAttr ds)) fTxt