fork download
  1. main = -- your code goes here
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
module FuckinStupidDoor
export Door,DoorWithCloser,DoorWithStopper,DoorWithStopperAndCloser,state,push,pull,setstopper,unsetstopper,turn,unturn
abstract AbstractDoor
abstract AbstractDoorWithStopper <: AbstractDoor
abstract AbstractDoorWithCloser <: AbstractDoor
openable(door::AbstractDoor)=!door.knob.unturned
closeable(door::AbstractDoor)=true
state(door::AbstractDoor)=ifelse(door.closed,"closed","opened")
type Knob
  unturned :: Bool
end
function turn(knob::Knob)
  knob.unturned=false
  knob
end
function unturn(knob::Knob)
  knob.unturned=true
  knob
end

type Door <:AbstractDoor
  closed :: Bool
  knob :: Knob
end
Door(closed::Bool,latched::Bool)=Door(closed,Knob(latched))

function turn(door::AbstractDoor)
  turn(door.knob)
  door
end
function unturn(door::AbstractDoor)
  unturn(door.knob)
  door
end
function opendoor(door::AbstractDoor)
  door.closed = false
  door
end
function closedoor(door::AbstractDoor)
  door.closed = true
  door
end
function pull(door::AbstractDoor)
  if closeable(door)
    closedoor(door)
  end
  door
end
function push(door::AbstractDoor)
  if openable(door)
    opendoor(door)
  end
  door
end

type DoorWithStopper <: AbstractDoorWithStopper
  closed :: Bool
  knob :: Knob
  stoppered :: Bool
end

DoorWithStopper(closed::Bool,unturned::Bool,stoppered::Bool)=DoorWithStopper(closed,Knob(unturned),stoppered)

closeable(door::AbstractDoorWithStopper) = !door.stoppered
function setstopper(door::AbstractDoorWithStopper)
  door.stoppered = true
  door
end
function unsetstopper(door::AbstractDoorWithStopper)
  door.stoppered = false
  door
end
function push(door::DoorWithStopper)
  unsetstopper(door)
  if openable(door)
     opendoor(door)
  end
  door
end

type DoorWithCloser <: AbstractDoorWithCloser
  closed :: Bool
  knob :: Knob
  closerdelay :: Float64
end
DoorWithCloser(closed::Bool,unturned::Bool,closerdelay::Float64)=DoorWithCloser(closed,Knob(unturned),closerdelay)
function autoclose(door::AbstractDoorWithCloser)
  sleep(door.closerdelay)
  door.closed = true
end
function opendoor(door::AbstractDoorWithCloser)
  door.closed = false
  schedule(@task autoclose(door))
  door
end


type DoorWithStopperAndCloser <: AbstractDoorWithStopper
  closed :: Bool
  knob :: Knob
  stoppered :: Bool
  closerdelay :: Float64
end
DoorWithStopperAndCloser(closed::Bool,unturned::Bool,stoppered::Bool,closerdelay::Float64)=DoorWithStopperAndCloser(closed,Knob(unturned),stoppered,closerdelay)
function autoclose(door::DoorWithStopperAndCloser)
  sleep(door.closerdelay)
  pull(door)
end
function opendoor(door::DoorWithStopperAndCloser)
  door.closed = false
  schedule(@task autoclose(door))
  door
end
function unsetstopper(door::DoorWithStopperAndCloser)
  door.stoppered = false
  schedule(@task autoclose(door))
  door
end

end


addprocs(1)

using FuckinStupidDoor
door = Door(true,true)
door |> state
door |> push |> state
door |> turn |> push |> state
door |> unturn |> pull |> push |> state
door |> turn |> push |> state
door = DoorWithStopper(true,true,true)
door |> push |> state
door |> turn |> push |> state
door |> setstopper |> pull |> state
door |> push |> pull |> state
door |> push |> state
door = DoorWithCloser(true,true,0.5)
door |> turn |> push |> state
door |> state
door |> unturn |> push |> state
door = DoorWithStopperAndCloser(true,true,true,0.5)
door |> turn |> push |> state
door |> state
door |> turn |> push |> setstopper |> state
door |> state
door |> unsetstopper |> state
door |> state

compilation info
[1 of 1] Compiling Main             ( prog.hs, prog.o )

prog.hs:1:30: error:
    parse error (possibly incorrect indentation or mismatched brackets)
stdout
Standard output is empty