{-# LANGUAGE TypeOperators, TypeFamilies, RankNTypes #-}

{-|
Module      : Action
Copyright   : (c) Kai Lindholm, 2014
License     : MIT
Maintainer  : megantti@gmail.com
Stability   : experimental

@Action@ is a command acting on various kinds of objects:

* torrents ('Network.RTorrent.Torrent.TorrentAction')
* files ('Network.RTorrent.File.FileAction')
* peers ('Network.RTorrent.Peer.PeerAction')
* trackers ('Network.RTorrent.Tracker.TrackerAction').

They all have the property that they can be executed on a single object or
on a group of objects.

For example, 

@
callRTorrent "localhost" 5000 $ some_action (some_id :: SomeId)
@
is a valid thing to write when @some@ is one of the previous objects.

To call an action on all torrents, you can use 'Network.RTorrent.Torrent.allTorrents', so that

@
callRTorrent "localhost" 5000 $ allTorrents getTorrentId
@
will return a list of torrent ids.

To call a action on other types of objects, you can use 'Network.RTorrent.Peer.allPeers',
'Network.RTorrent.File.allFiles', or 'Network.RTorrent.Tracker.allTrackers',
which will act on all peers, files, or trackers that are associated to a torrent.
They will also return ids for each object.
Then for example 

> allFiles getFileSizeBytes :: TorrentId -> TorrentAction [FileId :*: Int]
is an action that will return a list of ids and file sizes when run on a torrent.
These can further be used with 'Network.RTorrent.Torrent.allTorrents'.

To combine actions, you can use '<+>' and 'sequenceActions'
which correspond to ':*:' and @[]@ for commands.

In order to write new actions, 'simpleAction' can be used.

-}

module Network.RTorrent.Action (
      Action 
    , simpleAction
    , pureAction

    , sequenceActions
    , (<+>)

    , Param (..)
    , ActionB (..)

) where

import Network.RTorrent.Action.Internals