module CabalGild.Action.AttachComments where
import qualified CabalGild.Type.Comment as Comment
import qualified Control.Monad.Trans.State as StateT
import qualified Distribution.Fields as Fields
run ::
(Applicative m, Ord p) =>
([Fields.Field p], [Comment.Comment p]) ->
m ([Fields.Field (p, [Comment.Comment p])], [Comment.Comment p])
run :: forall (m :: * -> *) p.
(Applicative m, Ord p) =>
([Field p], [Comment p])
-> m ([Field (p, [Comment p])], [Comment p])
run ([Field p]
fs, [Comment p]
cs) = ([Field (p, [Comment p])], [Comment p])
-> m ([Field (p, [Comment p])], [Comment p])
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (([Field (p, [Comment p])], [Comment p])
-> m ([Field (p, [Comment p])], [Comment p]))
-> ([Field (p, [Comment p])], [Comment p])
-> m ([Field (p, [Comment p])], [Comment p])
forall a b. (a -> b) -> a -> b
$ State [Comment p] [Field (p, [Comment p])]
-> [Comment p] -> ([Field (p, [Comment p])], [Comment p])
forall s a. State s a -> s -> (a, s)
StateT.runState ([Field p] -> State [Comment p] [Field (p, [Comment p])]
forall p.
Ord p =>
[Field p] -> State [Comment p] [Field (p, [Comment p])]
fields [Field p]
fs) [Comment p]
cs
fields ::
(Ord p) =>
[Fields.Field p] ->
StateT.State [Comment.Comment p] [Fields.Field (p, [Comment.Comment p])]
fields :: forall p.
Ord p =>
[Field p] -> State [Comment p] [Field (p, [Comment p])]
fields = (Field p -> StateT [Comment p] Identity (Field (p, [Comment p])))
-> [Field p]
-> StateT [Comment p] Identity [Field (p, [Comment p])]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse Field p -> StateT [Comment p] Identity (Field (p, [Comment p]))
forall p.
Ord p =>
Field p -> State [Comment p] (Field (p, [Comment p]))
field
field ::
(Ord p) =>
Fields.Field p ->
StateT.State [Comment.Comment p] (Fields.Field (p, [Comment.Comment p]))
field :: forall p.
Ord p =>
Field p -> State [Comment p] (Field (p, [Comment p]))
field Field p
f = case Field p
f of
Fields.Field Name p
n [FieldLine p]
fls ->
Name (p, [Comment p])
-> [FieldLine (p, [Comment p])] -> Field (p, [Comment p])
forall ann. Name ann -> [FieldLine ann] -> Field ann
Fields.Field
(Name (p, [Comment p])
-> [FieldLine (p, [Comment p])] -> Field (p, [Comment p]))
-> StateT [Comment p] Identity (Name (p, [Comment p]))
-> StateT
[Comment p]
Identity
([FieldLine (p, [Comment p])] -> Field (p, [Comment p]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Name p -> StateT [Comment p] Identity (Name (p, [Comment p]))
forall p.
Ord p =>
Name p -> State [Comment p] (Name (p, [Comment p]))
name Name p
n
StateT
[Comment p]
Identity
([FieldLine (p, [Comment p])] -> Field (p, [Comment p]))
-> StateT [Comment p] Identity [FieldLine (p, [Comment p])]
-> State [Comment p] (Field (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (FieldLine p
-> StateT [Comment p] Identity (FieldLine (p, [Comment p])))
-> [FieldLine p]
-> StateT [Comment p] Identity [FieldLine (p, [Comment p])]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse FieldLine p
-> StateT [Comment p] Identity (FieldLine (p, [Comment p]))
forall p.
Ord p =>
FieldLine p -> State [Comment p] (FieldLine (p, [Comment p]))
fieldLine [FieldLine p]
fls
Fields.Section Name p
n [SectionArg p]
sas [Field p]
fs ->
Name (p, [Comment p])
-> [SectionArg (p, [Comment p])]
-> [Field (p, [Comment p])]
-> Field (p, [Comment p])
forall ann.
Name ann -> [SectionArg ann] -> [Field ann] -> Field ann
Fields.Section
(Name (p, [Comment p])
-> [SectionArg (p, [Comment p])]
-> [Field (p, [Comment p])]
-> Field (p, [Comment p]))
-> StateT [Comment p] Identity (Name (p, [Comment p]))
-> StateT
[Comment p]
Identity
([SectionArg (p, [Comment p])]
-> [Field (p, [Comment p])] -> Field (p, [Comment p]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Name p -> StateT [Comment p] Identity (Name (p, [Comment p]))
forall p.
Ord p =>
Name p -> State [Comment p] (Name (p, [Comment p]))
name Name p
n
StateT
[Comment p]
Identity
([SectionArg (p, [Comment p])]
-> [Field (p, [Comment p])] -> Field (p, [Comment p]))
-> StateT [Comment p] Identity [SectionArg (p, [Comment p])]
-> StateT
[Comment p]
Identity
([Field (p, [Comment p])] -> Field (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (SectionArg p
-> StateT [Comment p] Identity (SectionArg (p, [Comment p])))
-> [SectionArg p]
-> StateT [Comment p] Identity [SectionArg (p, [Comment p])]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse SectionArg p
-> StateT [Comment p] Identity (SectionArg (p, [Comment p]))
forall p.
Ord p =>
SectionArg p -> State [Comment p] (SectionArg (p, [Comment p]))
sectionArg [SectionArg p]
sas
StateT
[Comment p]
Identity
([Field (p, [Comment p])] -> Field (p, [Comment p]))
-> StateT [Comment p] Identity [Field (p, [Comment p])]
-> State [Comment p] (Field (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Field p -> State [Comment p] (Field (p, [Comment p])))
-> [Field p]
-> StateT [Comment p] Identity [Field (p, [Comment p])]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse Field p -> State [Comment p] (Field (p, [Comment p]))
forall p.
Ord p =>
Field p -> State [Comment p] (Field (p, [Comment p]))
field [Field p]
fs
name ::
(Ord p) =>
Fields.Name p ->
StateT.State [Comment.Comment p] (Fields.Name (p, [Comment.Comment p]))
name :: forall p.
Ord p =>
Name p -> State [Comment p] (Name (p, [Comment p]))
name (Fields.Name p
p FieldName
fn) =
(p, [Comment p]) -> FieldName -> Name (p, [Comment p])
forall ann. ann -> FieldName -> Name ann
Fields.Name
((p, [Comment p]) -> FieldName -> Name (p, [Comment p]))
-> StateT [Comment p] Identity (p, [Comment p])
-> StateT [Comment p] Identity (FieldName -> Name (p, [Comment p]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p -> StateT [Comment p] Identity (p, [Comment p])
forall p. Ord p => p -> State [Comment p] (p, [Comment p])
toPosition p
p
StateT [Comment p] Identity (FieldName -> Name (p, [Comment p]))
-> StateT [Comment p] Identity FieldName
-> StateT [Comment p] Identity (Name (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FieldName -> StateT [Comment p] Identity FieldName
forall a. a -> StateT [Comment p] Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FieldName
fn
fieldLine ::
(Ord p) =>
Fields.FieldLine p ->
StateT.State [Comment.Comment p] (Fields.FieldLine (p, [Comment.Comment p]))
fieldLine :: forall p.
Ord p =>
FieldLine p -> State [Comment p] (FieldLine (p, [Comment p]))
fieldLine (Fields.FieldLine p
p FieldName
bs) =
(p, [Comment p]) -> FieldName -> FieldLine (p, [Comment p])
forall ann. ann -> FieldName -> FieldLine ann
Fields.FieldLine
((p, [Comment p]) -> FieldName -> FieldLine (p, [Comment p]))
-> StateT [Comment p] Identity (p, [Comment p])
-> StateT
[Comment p] Identity (FieldName -> FieldLine (p, [Comment p]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p -> StateT [Comment p] Identity (p, [Comment p])
forall p. Ord p => p -> State [Comment p] (p, [Comment p])
toPosition p
p
StateT
[Comment p] Identity (FieldName -> FieldLine (p, [Comment p]))
-> StateT [Comment p] Identity FieldName
-> StateT [Comment p] Identity (FieldLine (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FieldName -> StateT [Comment p] Identity FieldName
forall a. a -> StateT [Comment p] Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FieldName
bs
sectionArg ::
(Ord p) =>
Fields.SectionArg p ->
StateT.State [Comment.Comment p] (Fields.SectionArg (p, [Comment.Comment p]))
sectionArg :: forall p.
Ord p =>
SectionArg p -> State [Comment p] (SectionArg (p, [Comment p]))
sectionArg SectionArg p
sa = case SectionArg p
sa of
Fields.SecArgName p
p FieldName
bs ->
(p, [Comment p]) -> FieldName -> SectionArg (p, [Comment p])
forall ann. ann -> FieldName -> SectionArg ann
Fields.SecArgName
((p, [Comment p]) -> FieldName -> SectionArg (p, [Comment p]))
-> StateT [Comment p] Identity (p, [Comment p])
-> StateT
[Comment p] Identity (FieldName -> SectionArg (p, [Comment p]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p -> StateT [Comment p] Identity (p, [Comment p])
forall p. Ord p => p -> State [Comment p] (p, [Comment p])
toPosition p
p
StateT
[Comment p] Identity (FieldName -> SectionArg (p, [Comment p]))
-> StateT [Comment p] Identity FieldName
-> State [Comment p] (SectionArg (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FieldName -> StateT [Comment p] Identity FieldName
forall a. a -> StateT [Comment p] Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FieldName
bs
Fields.SecArgStr p
p FieldName
bs ->
(p, [Comment p]) -> FieldName -> SectionArg (p, [Comment p])
forall ann. ann -> FieldName -> SectionArg ann
Fields.SecArgStr
((p, [Comment p]) -> FieldName -> SectionArg (p, [Comment p]))
-> StateT [Comment p] Identity (p, [Comment p])
-> StateT
[Comment p] Identity (FieldName -> SectionArg (p, [Comment p]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p -> StateT [Comment p] Identity (p, [Comment p])
forall p. Ord p => p -> State [Comment p] (p, [Comment p])
toPosition p
p
StateT
[Comment p] Identity (FieldName -> SectionArg (p, [Comment p]))
-> StateT [Comment p] Identity FieldName
-> State [Comment p] (SectionArg (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FieldName -> StateT [Comment p] Identity FieldName
forall a. a -> StateT [Comment p] Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FieldName
bs
Fields.SecArgOther p
p FieldName
bs ->
(p, [Comment p]) -> FieldName -> SectionArg (p, [Comment p])
forall ann. ann -> FieldName -> SectionArg ann
Fields.SecArgOther
((p, [Comment p]) -> FieldName -> SectionArg (p, [Comment p]))
-> StateT [Comment p] Identity (p, [Comment p])
-> StateT
[Comment p] Identity (FieldName -> SectionArg (p, [Comment p]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> p -> StateT [Comment p] Identity (p, [Comment p])
forall p. Ord p => p -> State [Comment p] (p, [Comment p])
toPosition p
p
StateT
[Comment p] Identity (FieldName -> SectionArg (p, [Comment p]))
-> StateT [Comment p] Identity FieldName
-> State [Comment p] (SectionArg (p, [Comment p]))
forall a b.
StateT [Comment p] Identity (a -> b)
-> StateT [Comment p] Identity a -> StateT [Comment p] Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> FieldName -> StateT [Comment p] Identity FieldName
forall a. a -> StateT [Comment p] Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure FieldName
bs
toPosition ::
(Ord p) =>
p ->
StateT.State [Comment.Comment p] (p, [Comment.Comment p])
toPosition :: forall p. Ord p => p -> State [Comment p] (p, [Comment p])
toPosition p
p = do
[Comment p]
cs <- StateT [Comment p] Identity [Comment p]
forall (m :: * -> *) s. Monad m => StateT s m s
StateT.get
let ([Comment p]
xs, [Comment p]
ys) = (Comment p -> Bool) -> [Comment p] -> ([Comment p], [Comment p])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span ((p -> p -> Bool
forall a. Ord a => a -> a -> Bool
<= p
p) (p -> Bool) -> (Comment p -> p) -> Comment p -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Comment p -> p
forall a. Comment a -> a
Comment.annotation) [Comment p]
cs
[Comment p] -> StateT [Comment p] Identity ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
StateT.put [Comment p]
ys
(p, [Comment p]) -> State [Comment p] (p, [Comment p])
forall a. a -> StateT [Comment p] Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (p
p, [Comment p]
xs)