aboutsummaryrefslogblamecommitdiff
path: root/CLPM/Repository.icl
blob: d0b089d4b98d76841408ed87c4ae3406f7356ed2 (plain) (tree)
1
2
3
4
5
6
7





                                     













                                  
                



                                                                     


                                                     
                                                            
                         
             

                                          
                                    












                                                                                          
implementation module CLPM.Repository

import StdBool
import StdClass
from StdFunc import flip, o
import StdOverloaded

import Control.Applicative
import Control.Monad

import Data.Error
from Data.Func import $
import Data.Functor
import Data.Maybe
import Data.Tuple

import Internet.HTTP

from Text import instance + String
import Text.JSON

import CLPM.Package
import CLPM.Util

derive JSONDecode RepositoryItem, RepositoryItemVersion

getRepository :: Url *World -> *(MaybeErrorString Repository, *World)
getRepository repo w
# (resp,w) = doRequest req w
| isError resp
	= (Error $ fromError resp, w)
# repo = fromJSON $ fromString (fromOk resp).rsp_data
| isNothing repo
	= (Error $ "Server did not return a repository.", w)
= (Ok $ fromJust repo, w)
where
	req =
		{ newHTTPRequest
		& req_path = "/list.php"
		, server_name = REPOSITORY
		, server_port = PORT
		}

getVersions :: (PackageName Repository -> [RepositoryItemVersion])
getVersions = flip (getvs [])
where
	getvs :: [RepositoryItemVersion] Repository PackageName -> [RepositoryItemVersion]
	getvs vs []    p             = vs
	getvs vs [i:r] p
	| i.RepositoryItem.name == p = getvs (vs ++ i.RepositoryItem.versions) r p
	| otherwise                  = getvs  vs                               r p

resolve :: PackageName VersionRequirement Repository -> [RepositoryItemVersion]
resolve p req rep = [v \\ ri <- rep, v <- ri.versions
	| ri.RepositoryItem.name == p && satisfies req v.RepositoryItemVersion.version]