packages feed

clr-inline-0.2.0.1: src/Clr/Inline/IEnumerable.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
module Clr.Inline.IEnumerable where

import Clr.Inline
import Control.Monad
import Pipes

[fsharp|open System.Collections|]

toProducer :: Clr "IEnumerable" -> Producer (Clr "obj") IO ()
toProducer enumerable = do
  enumerator <- liftIO [fsharp| IEnumerator{ ($enumerable:IEnumerable).GetEnumerator() } |]
  let loop = do
        nxt <- liftIO [fsharp| bool{ ($enumerator:IEnumerator).MoveNext()} |]
        when nxt $ do
            cur <- liftIO [fsharp| obj{ ($enumerator:IEnumerator).Current } |]
            yield cur
            loop
  loop